我最近在一次演講中聽到,對volatile進行寫操作會觸發線程寫入的每個變量的內存屏障。這真的是對的嗎?從JLS看來,似乎只有相關的變量會被刷新,而不是其他的。有人知道實際上是正確的嗎?有人能指出我在JLS的具體位置嗎?是對Java中volatile變量的內存屏障的寫入
16
A
回答
1
到Volatile variables and other variables參考是正確的。我沒有意識到發生的傳遞性 - 之前是VM必須執行的事情,而不是定義中的事情。我仍然不明白爲什麼某些具有如此深遠影響的事物沒有明確說明,實際上是某種定義的必然結果。要包起來:假設你有4個動作是這樣的:
thread1 thread2
a1
a2
a3
a4
其中A2是一個volatile變量v和A3寫是從同一揮發性變量v讀 它的發生在definiton如下(hb)表示hb(a1,a2)和hb(a3,a4)。 另外,對於揮發物我們有hb(a2,a3)。現在從hb所需的傳遞性hb(a1,a3)開始。因此,易失性變量v的寫入和後續讀取用作內存屏障。
16
是的,它會啓動一個障礙。您可以閱讀更多here。有4種類型,LoadLoad LoadStore StoreStore StoreLoad。
至於你的問題
從JLS,似乎只有涉及的變量被刷新 出來,而不是其他。有人知道實際上是正確的嗎?
任何其他線程都可以看到發生在易失性存儲區之前的所有寫入,而其他線程加載此新存儲的謂詞。但是,在易失性加載之前發生的寫入可能會或可能不會被其他線程看到,如果它們不加載新值的話。
對於一個實際的例子
volatile int a =0;
int b = 0;
Thread-1
b = 10;
a = 3;
Thread-2
if(a == 0){
// b can b 10 or 0
}
if(a == 3){
// b is guaranteed to be 10 (according to the JMM)
}
相關問題
- 1. pthread_cond_signal或pthread_cond_broadcast調用是否意味着寫入內存屏障?
- 2. 內存屏障()
- 3. Java中的volatile變量問題
- 4. Java volatile變量,多線程
- 5. C中的volatile變量
- 6. 使用volatile變量和旗語 - Java的
- 7. 在Java中使用volatile變量
- 8. WaitForSingleObject是否充當內存屏障?
- 9. 單線程內存屏障
- 10. 跨進程內存屏障
- 11. java中的循環屏障
- 12. volatile變量的解釋
- 13. 對內存中的Java對象進行故障轉移
- 14. c中存儲的常量volatile變量在哪裏?
- 15. 加入線程時是否需要內存屏障?
- 16. 本地volatile變量
- 17. 鎖定語句的內存屏障
- 18. 內存屏障/柵欄的開銷
- 19. 內存中的變量是以C++存儲的變量嗎?
- 20. 寫入volatile變量後會發生什麼?
- 21. 這是x86上更好的寫入屏障:lock + addl或xchgl?
- 22. Java,指向內存中同一對象的引用變量
- 23. 將變量的內容寫入文件
- 24. Java中的變量內部變量
- 25. Java中併發讀取/寫入變量
- 26. 共享內存中內部進程的屏障實現
- 27. 在Java泛型的協變和反變量中的寫入
- 28. Java中的「volatile」是什麼意思?
- 29. 我是否以錯誤的方式使用內存屏障?
- 30. 內存屏障是否與某些特定的內存位置有關?
我對JLS的解釋與你的一致。 – NPE
[volatile變量和其他變量]的可能重複(http://stackoverflow.com/questions/12438464/volatile-variables-and-other-variables) – assylias
正如答案所闡明的那樣,它不僅僅是聲明爲volatile的變量,所有寫入發生在易失性寫入之前。 – sjlee