什么叫CAS(Compare and Swap)?
硬件同步原語!! 什么蛋疼的名字,一般人很難理解。根據英文全稱翻譯==比較與交換,這個名字大致還能理解一點,目前先暫且這么理解吧.
有啥用處?
對於常用多線程編程的人估計知道,對於一般人估計都不曾聽說。在jdk5之前,我們知道,在多線程編程的時候,為了保證多個線程對一個對象同時進行訪問時,我們需要加同步鎖synchronized,保證對象的在使用時的正確性,但是加鎖的機制會導致如下幾個問題
1.加多線程競爭下,加鎖和釋放鎖會導致較多的上下文切換,引起性能問題。
2.多線程可以導致死鎖的問題。
3.多線程持有的鎖會導致其他需要此鎖的線程掛起。
4......
有更好的辦法么?
鎖的分類:獨占鎖(悲觀鎖),樂觀鎖
獨占鎖:synchronized就是一種獨占鎖,它會導致所有需要此鎖的線程掛起,等待鎖的釋放。
樂觀鎖:每次不加鎖去完成操作,如果因為沖突失敗就重試,直到成功。
CAS的機制就相當於這種(非阻塞算法),CAS是由CPU硬件實現,所以執行相當快.CAS有三個操作參數:內存地址,期望值,要修改的新值,當期望值和內存當中的值進行比較不相等的時候,表示內存中的值已經被別線程改動過,這時候失敗返回,當相等的時候,將內存中的值改為新的值,並返回成功。
java 中代碼實現
在 java.util.concurrent.atomic包中可以查看源代碼的實現,這里參java.util.concurrent.atomic.AtomicLong源代碼,貼出核心代碼:
//+1操作 public final long getAndIncrement() { while (true) { long current = get(); long next = current + 1; //當+1操作成功的時候直接返回,退出此循環 if (compareAndSet(current, next)) return current; } } //調用JNI實現CAS public final boolean compareAndSet(long expect, long update) { return unsafe.compareAndSwapLong(this, valueOffset, expect, update); }