Java并发编程 Volatile关键字解析
生活随笔
收集整理的這篇文章主要介紹了
Java并发编程 Volatile关键字解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
volatile關鍵字的兩層語義 一旦一個共享變量(類的成員變量、類的靜態成員變量)被volatile修飾之后,那么就具備了兩層語義: 1)保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。 2)禁止進行指令重排序。 根據volatile的語義,我們可以看到,volatile主要針對的是并發三要素(原子性,可見性和有序性)中的后兩者有實際優化作用。 可見性: 線程本身并不直接與主內存進行數據的交互,而是通過線程的工作內存來完成相應的操作。這也是導致線程間數據不可見的本質原因。因此要實現volatile變量的可見性,直接從這方面入手即可。對volatile變量的寫操作與普通變量的主要區別有兩點: (1)修改volatile變量時會強制將修改后的值刷新的主內存中。 (2)修改volatile變量后會導致其他線程工作內存中對應的變量值失效。因此,再讀取該變量值的時候就需要重新從讀取主內存中的值。 通過這兩個操作,就可以解決volatile變量的可見性問題。 有序性: volatile會觸發jvm的內存屏障策略 內存屏障策略: (1)LoadLoad 屏障 執行順序:Load1—>Loadload—>Load2 確保Load2及后續Load指令加載數據之前能訪問到Load1加載的數據。 (2)StoreStore 屏障 執行順序:Store1—>StoreStore—>Store2 確保Store2以及后續Store指令執行前,Store1操作的數據對其它處理器可見。 (3)LoadStore 屏障 執行順序: Load1—>LoadStore—>Store2 確保Store2和后續Store指令執行前,可以訪問到Load1加載的數據。 (4)StoreLoad 屏障 執行順序: Store1—> StoreLoad—>Load2 每次對volatile進行讀寫操作,根據上述表格,會觸發對應的CPU指令,從線程內存緩沖區將之前更改的變量刷入主存。 簡單來說,volatile會在一定程度上影響jvm指令集的優化策略,在volatile之前和之后的指令集不會亂序越過volatile變量執行。暫時volatile之前和之后的指令集在沒有關聯性的前提下,jvm可以亂序執行。 jvm的volatile策略,在一定程度上,打折扣地實現了jvm的happens-before原則(先行發生原則),如下所述。
- 程序次序規則:一個線程內,按照代碼順序,書寫在前面的操作先行發生于書寫在后面的操作
- 鎖定規則:一個unLock操作先行發生于后面對同一個鎖額lock操作
- volatile變量規則:對一個變量的寫操作先行發生于后面對這個變量的讀操作
- 傳遞規則:如果操作A先行發生于操作B,而操作B又先行發生于操作C,則可以得出操作A先行發生于操作C
- 線程啟動規則:Thread對象的start()方法先行發生于此線程的每個一個動作
- 線程中斷規則:對線程interrupt()方法的調用先行發生于被中斷線程的代碼檢測到中斷事件的發生
- 線程終結規則:線程中所有的操作都先行發生于線程的終止檢測,我們可以通過Thread.join()方法結束、Thread.isAlive()的返回值手段檢測到線程已經終止執行
- 對象終結規則:一個對象的初始化完成先行發生于他的finalize()方法的開始
volatile常見使用場景:
(1)狀態標記量
(2)單例模式一次性安全發布
(3)低開銷讀寫鎖
?
?
參考文檔: 《Java并發編程:Volatile關鍵字解析》http://www.cnblogs.com/dolphin0520/p/3920373.html 《Java多線程:volatile變量,happens-before關系及內存一致性》http://www.importnew.com/17149.html 《Java并發編程:volatile的使用及其原理》http://www.cnblogs.com/paddix/p/5428507.html 《Java理論與實踐:正確使用Volatile變量》https://www.ibm.com/developerworks/cn/java/j-jtp06197.html?
轉載于:https://www.cnblogs.com/researchboy/p/researchboy.html
總結
以上是生活随笔為你收集整理的Java并发编程 Volatile关键字解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下修改rm命令防止误删除
- 下一篇: 10. Firewalls (防火墙 2