一个关于多线程不可见性与While语句是非为空的问题?
static boolean flag = false;
public static void main(String[] args) {
new Thread(new read(){
@Override
public void run() {
while (!flag){
System.out.println("你能看见我吗?");
}
// System.out.println(flag);
}
}).start();
TreadUtils.sleep(2000);//先睡眠主线程一会
// System.out.println(flag);
flag= true;
}
从上面代码,while判断为真值,flag拿到缓冲区的值为false,判断出为true,理论上死循环退出不了。但实际上最后会结束进程。
结果如上图,线程最后获取到了true值。
下面改动一点点,代码如下:
static boolean flag = false;
public static void main(String[] args) {
new Thread(new read(){
@Override
public void run() {
while (!flag){}//改这里,让他不包裹打印语句,变成空语句
System.out.println("你能看见我吗?");
// System.out.println(flag);
}
}).start();
TreadUtils.sleep(2000);//先睡眠主线程一会
// System.out.println(flag);
flag= true;
}
然后线程就会一直循环,结束不了。
结果如图:
那么问题来了,根据多线程的不可见性,那么应该出现下面这种一直循环,一直打印输出的才对。为什么有个输出语句就能获取到主线程后面被改的值而结束循环,但空语句就不行???
System.out.println()中有synchronized存在,synchronized也能解决可见性问题。