2011-08-18 42 views

回答

0

JVM爲您提供了一些弱保證。編譯器和硬件導致您的問題。 :-)

當一個線程讀取一個變量時,它不一定會從內存中獲取最新值。處理器可能會返回一個緩存的值。另外,即使程序員編寫了代碼,首先編寫變量並稍後讀取代碼,編譯器可能會重新排列語句,只要它不會更改程序語義。處理器和編譯器在執行性能優化時很常見。因此,線程可能看不到它期望看到的值。這可能會導致很難修復併發程序中的錯誤。

大多數程序員都熟悉這樣一個事實,即進入一個同步塊意味着獲得監視器上的一個鎖,以確保其他線程無法進入同步塊。不太熟悉但同樣重要的是事實

(1)獲取鎖定並輸入同步塊強制線程刷新內存中的數據。 (2)在退出同步塊時,寫入的數據被刷新到內存。 http://www.javacodegeeks.com/2011/02/java-memory-model-quick-overview-and.html

參見JSR 133(Java內存模型和線程規範修訂版)http://jcp.org/en/jsr/detail?id=133發佈了它與JDK 1.5。