1. 程式人生 > >《Java併發程式設計實戰》學習筆記之 第3章 物件的共享

《Java併發程式設計實戰》學習筆記之 第3章 物件的共享

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