如果多個線程讀取之前已設置且以後不會更改的基本類型,它們是否會得到錯誤的值?多線程讀取原始類型
例如,假定下面的簡單代碼摘錄:
public static final boolean proceed = read(); // Read the value from a file
public static void doSomething() // Method accessed by multiple threads
{
if (proceed)
{
System.out.println("TRUE");
}
else
{
System.out.println("FALSE");
}
}
假設proceed
變量初始化爲true
,是有可能的是,在一個或多個所述多個線程的同時運行的doSomething()
方法,打印的信息是FALSE
?
如果proceed
變量是可變的,肯定這是可能的,因此需要同步或者使用AtomicBoolean
(例如根據this question)。但在這種情況下,proceed
是不可變的,只能在包含類的靜態初始化期間設置一次。
對於其他基元類型,類似地,如果一個值被設置爲final,那麼它應該始終是線程安全的,以後再訪問它,對嗎?
雖然雙和長您的評論是準確的,但並不適用於這個問題。使用double而不是boolean的問題會得到相同的答案。 – assylias 2012-07-18 13:19:26