2014-03-04 33 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