CAS原理

​ compareAndSet()方法調用簡稱爲CAS。JDK文檔對該方法的說明如下:如果當前狀態值等於預期值,則以原子方式將同步狀態設置爲給定的更新值。此操作具有volatile讀和寫的內存語義。

​ 編譯器不會對volatile讀與volatile讀後面的任意內存操作重排序;編譯器不會對volatile寫與volatile寫前面的任意內存操作重排序。組合這兩個條件,意味着爲了同時實現volatile讀和volatile寫的內存語義,編譯器不能對CAS與CAS前面和後面的任意內存操作重排序。

​ 程序會根據當前處理器的類型來決定是否爲cmpxchg指令添加lock前綴。如果程序是在多處理器上運行,就爲cmpxchg指令加上lock前綴(Lock Cmpxchg)。反之,如果程序是在單處理器上運行,就省略lock前綴(單處理器自身會維護單處理器內的順序一致性,不需要lock前綴提供的內存屏障效果)。

intel的手冊對lock前綴的說明如下。

1)確保對內存的讀-改-寫操作原子執行。在Pentium及Pentium之前的處理器中,帶有lock前綴的指令在執行期間會鎖住總線,使得其他處理器暫時無法通過總線訪問內存。很顯然,這會帶來昂貴的開銷。從Pentium 4、Intel Xeon及P6處理器開始,Intel使用緩存鎖定(Cache Locking)來保證指令執行的原子性。緩存鎖定將大大降低lock前綴指令的執行開銷。

2)禁止該指令,與之前和之後的讀和寫指令重排序。

3)把寫緩衝區中的所有數據刷新到內存中。

上面的第2點和第3點所具有的內存屏障效果,足以同時實現volatile讀和volatile寫的內存語義。

concurrent包的實現示意圖:

在這裏插入圖片描述

發佈了311 篇原創文章 · 獲贊 114 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章