原子操作atomic 的實現原理
阿新 • • 發佈:2019-01-09
原子atom 本意是“不能被進一步分割的最小粒子”,原子操作 atomic operation 是“不能被中斷的一系列操作”,在多處理上實現原子操作有些複雜。
處理器實現原子操作的方式由兩種:
1、通過使用匯流排鎖來保證原子性。如多個處理器同時對共享變數進行操作,使用匯流排鎖,可以保證只有一個處理器在操作共享記憶體,其他處理器無法的請求將被阻塞。
2、通過快取鎖定保證原子性。匯流排鎖鎖定處理器和記憶體之間的通訊,開銷很大,而有時只需要鎖定某個變數即可。
java 如何實現原子性操作:
java 通過鎖和cas迴圈來實現原子操作。
CAS 操作 compare and swap ,比較和更新,CAS的語義為:"我認為v的值應該為A,如果是,將V的值更新為B",CAS 有三個運算元,記憶體值V,期望值A,更新值B,當且僅當V=A 時,才實現V=B的操作。 當多執行緒使用CAS同時更新一個變數時,只有其中一個變數能更新變數的值,其他執行緒失敗,失敗的執行緒並不會被掛起,而是被告知競爭失敗,並再次嘗試。
如果我們仔細分析concurrent包的原始碼實現,會發現一個通用化的實現模式:
- 首先,宣告共享變數為volatile;
- 然後,使用CAS的原子條件更新來實現執行緒之間的同步;
- 同時,配合以volatile的讀/寫和CAS所具有的volatile讀和寫的記憶體語義來實現執行緒之間的通訊。
AQS,非阻塞資料結構和原子變數類(java.util.concurrent.atomic包中的類),這些concurrent包中的基礎類都是使用這種模式來實現的,而concurrent包中的高層類又是依賴於這些基礎類來實現的。從整體來看,concurrent包的實現示意圖如下