线程2是否可以打印“x = 0”?

时间:2015-09-01 05:51:27

标签: java

线程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);

2 个答案:

答案 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之后不能重新排序。

相关问题