2014-03-04 80 views
0

我有两个线程运行在Main.java和一个布尔型字段Main.bool,它在开始时为false。 第一个线程将Main.bool设置为true。 之后,第二个线程将打印出Main.bool。结果是FALSEjava日食,布尔值出错

更有趣的是,我在打印Main.bool之前打印出一个随机文本,然后结果证明是正确的(true)。

任何人都知道这里发生了什么?我正在使用eclipse Kepler。

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 
+1

使您的字段“volatile”。 –

+0

处理多线程时,使用volatile字段使其同步化 – Kick

+0

当您有多个线程时,不能保证线程执行的顺序。他们将以任意方式执行。因此,在thread1更改值之前,thread2可能会打印出布尔值。 – Solace

回答

0

使您的提交'布尔'易变。

任何写入到易失性可变建立之前发生的同一个变量

随后关系读取有关详细info

注意:使字段变为易失性,确保任何正在读取该字段值的人从内存中读取,而不是从本地副本读取。

+0

是的,谢谢你,我知道易变的领域,我只是不明白为什么它发生这种方式,而你的似乎是正确的答案:) – Aliencc

0

形式JLS-8.3.1.4

Java编程语言提供了第二种机制,挥发领域,这是不是锁定为了某些目的更方便。

中的字段可被声明挥发性的,在这种情况下,Java内存模型确保所有线程看到一致的值的变量

更多细节参见:

  1. Atomic Access
  2. What are Transient and Volatile Modifiers