JavaEclipse,布尔值出错

JavaEclipse,布尔值出错,java,eclipse,boolean,Java,Eclipse,Boolean,我在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 /

我在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

让你的文件“bool”变得易变

对易失性变量的任何写入都会与该变量的后续读取建立“发生在之前”的关系

更多

注意:将字段设置为易失性,可确保读取该字段值的任何人都从内存而不是本地副本中读取该字段。

表单

Java编程语言提供了第二种机制,volatile字段,在某些方面比锁定更方便

字段可以声明为volatile,在这种情况下,Java内存模型确保所有线程都能看到变量的一致值

有关更多详细信息,请参阅:


  • 将字段设置为volatile。处理多线程时,请使用volatile字段使其同步。如果有多个线程,则无法保证线程的执行顺序。它们将以任意方式轮流执行。因此,thread2有可能在thread1更改值之前打印出布尔值。不,不是这样,我确保thread1发生在thread2之前。是的,谢谢,我知道volatile字段,我只是不明白为什么会这样,你的答案似乎是正确的:)