我有两个在Main.java上运行的线程和一个布尔字段Main.bool,它在开头是假的。 第一个线程将Main.bool设置为true。 之后,第二个帖子将打印出Main.bool。结果是 FALSE 。
更有趣的是,我尝试在打印Main.bool之前打印出一个随机文本,然后结果证明是正确的(true)。
任何人都知道这里发生了什么?我正在使用eclipse开普勒。
Main.bool = false;
thread1.setBool(true);
// then wait for some seconds
// case 1
thread2.printBool(); --> false
// case 2
System.out.println("blah blah");
thread2.printBool(); --> true
答案 0 :(得分:0)
让你的'bool'变得不稳定。
对volatile变量的任何写入都会建立与之后读取相同变量的先发生关系
了解更多info。
注意:使字段变为volatile,确保正在读取该字段值的任何人从内存而不是本地副本中读取它。
答案 1 :(得分:0)
Java编程语言提供了第二种机制volatile字段,比某些用途的锁定更方便。
字段可以声明为volatile,在这种情况下,Java Memory Model可以确保所有线程都看到变量的一致值
有关详细信息,请参阅: