《Java併發程式設計實戰》學習筆記之 第3章 物件的共享
阿新 • • 發佈:2019-02-17
1.記憶體可見性
synchronized關鍵字同步有兩方面的作用:
(1)實現原子性或者確定臨界區
(2)確保記憶體可見性
所謂記憶體可見性,即當一個執行緒修改了物件狀態後,其他執行緒能夠看到修改後的狀態。
多執行緒程式在沒有同步的情況下,編譯器、處理器及執行時等都可能對操作執行順序進行一些意想不到的調整。在缺乏足夠同步的多執行緒程式中,要想對記憶體操作的執行順序進行判斷,幾乎無法得出正確的結論。
1.1 失效資料
比如執行緒在沒有同步的情況下讀取變數時得到的可能是失效資料(之前某個執行緒設定的值)。
1.2 非原子的64位操作
非volatile的64位數值變數,比如long,double,JVM允許將64位的讀操作或寫操作分解為兩個32位的操作。如果對該變數的讀操作和寫操作在不同的執行緒中執行,那麼很可能讀取到某個值的高32位和另一個值的低32位而導致錯誤。
1.3加鎖與可見性
加鎖的含義不僅包括互斥行為,還包括記憶體可見性,為了確保所有執行緒都能看到共享變數的最新值,所有執行讀或寫操作的執行緒都必須在同一個鎖上同步。
1.4 volatile變數
volatile變數是一種稍弱的同步機制,用來確保將變數的更新操作通知到其他執行緒。
volatile變數只能確保可見性,而不能確保原子性。
2.釋出與逸出
TODO