之前看源代碼的時候,發現了有兩個方法。一個是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能檢測到來自其他線程的干擾,因此即使不使用鎖也能夠實現原子的讀 改 寫操作序列。