以前我認爲可見性問題是由CPU緩存引起的性能。由JVM或硬件引起的Java中的可見性問題?
但是我看到這篇文章:http://www.ibm.com/developerworks/java/library/j-5things15/index.html
在第3款volatile變量,它告訴線程保持高速緩存,聽起來像高速緩存由JVM造成的。
答案是? JVM還是硬件?
以前我認爲可見性問題是由CPU緩存引起的性能。由JVM或硬件引起的Java中的可見性問題?
但是我看到這篇文章:http://www.ibm.com/developerworks/java/library/j-5things15/index.html
在第3款volatile變量,它告訴線程保持高速緩存,聽起來像高速緩存由JVM造成的。
答案是? JVM還是硬件?
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。
你能更清楚你的「可見性」問題的含義嗎? – Ryan