迷幻问题一 没有println方法,主线程无法读变量
public class ThreadTest {
public static void main(String[] args) {
Num num = new Num(0);
new Thread(()->{
while (true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
num.setI(num.getI()+1);
}
}).start();
//问题代码
// while (true){
// //System.out.println注释掉 就不能打印到3s了..为什么?
// //System.out.println(num.getI());
// if (num.getI()==3) {
// System.out.println("到3s了!!!!");
// break;
// }
// }
//这是答案,因为println会拿到对象锁,主线程有时间观察num对象的值变化
while (true){
synchronized (num){
if (num.getI()==3) {
System.out.println("到3s了!!!!");
break;
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static class Num{
private int i;
public Num(int i) {
this.i = i;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
}
实际上这个问题是println不熟悉导致的,println 使用synchronized拿到了对象锁,也就是使用println的这个线程拿到对象的锁,所以可以读到对象的数据
public void println(String x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
标签:getI,java,int,System,神出鬼没,num,println,public
From: https://www.cnblogs.com/cfas/p/17110674.html