线程2是否可以打印“x = 0”?
int x = 0;
boolean bExit = false;
Thread 1 (not synchronized)
x = 1;
bExit = true;
Thread 2 (not synchronized)
if (bExit == true)
System.out.println("x=" + x);
答案 0 :(得分:7)
线程2是否可以打印“x = 0”?
是如果JIT编译器将指令重新排序为:
<强>线程1:强>
bExit=true
x=1
<强>线程2:强>
if (bExit == true) System.out.println("x=" + x); //prints 0
当您使用synchronized块(或其他相关结构)时,编译器不会重新排序这些内容。
答案 1 :(得分:2)
答案:是的,线程T2可能会打印x = 0.为什么?因为没有任何指令编译器,例如synchronized或volatile,bExit = true可能在编译器重新排序中在x = 1之前出现。此外,x = 1可能在线程2中不可见,因此线程2将加载x = 0。现在,你如何解决它?当我向几个程序员提出这个问题时,他们回答的方式不同,一个建议让两个线程在一个共同的互斥锁上同步,另一个表示使两个变量都变量不稳定。两者都是正确的,因为它会阻止重新排序并保证可见性。但是最好的答案是你只需要使bExit变为易失性,然后线程2只能打印“x = 1”。 x不需要是volatile,因为当bExit是volatile时,b在bExit = true之后不能重新排序。