java CAS compareAndSet, compareAndSwap 區別


之前看源代碼的時候,發現了有兩個方法。一個是compareAndSet,一個是compareAndSwap, 傻傻分不清這兩個到底哪個是CAS呢。

我看了java並發編程實戰 找到了答案。

CAS 是一種計算機的指令。

CAS包含3個操作數, 需要讀寫的內存位置V,進行比較的值A和擬寫入的新值B。當且僅當V的值等於A時,CAS才會通過原子方式用新值B來更新V的值,否則不會執行任何操作。無論位置V的值是否等於A,都將返回V原有的值。(這種變化形式被稱為比較並設置,無論操作是否成功都會返回。)CAS的含義是 我認為V的值應該為A,如果是,那么將V的值更新為B,否則不修改並告訴V的值實際為多少。

所以我們來看源代碼。

1     protected final boolean compareAndSetState(int expect, int update) {
2         // See below for intrinsics setup to support this
3         return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
4     }

上面的代碼是AbstractQueuedSynchronizer 這個類中的方法。

可以看到 compareAndSetState 方法相當於compareAndSet 方法,是一個api。而我們來看它的實現,發現調用unsafe類的compareAndSwapInt。這里unsafe類可以調用計算機底層的東西。

所以我們可以得出CAS 是指的 compareAndSwap方法,意思是比較並交換。

java並發編程實戰中給出這樣一個模擬CAS的操作的示例:

 

 CAS的典型使用模式是: 首先從V中讀取值A,並根據A計算新值B,然后再通過CAS以原子方式將V中的值由A變成B(只要在這期間沒有任何線程將V的值修改為其他值)。由於CAS能檢測到來自其他線程的干擾,因此即使不使用鎖也能夠實現原子的讀 改 寫操作序列。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM