java中CAS實現的原理
阿新 • • 發佈:2019-01-01
- 從書中看到java中可以通過CAS的方式實現原子操作。在這裡用了JAVA提供的用於原子操作的atomic類中的atomicInteger。
- 例子中的安全計數器程式碼如下:
private void safeCount(){
for(::){
int i = atomicI.get();
boolean suc = atomicI.compareAndSet(i,++i);
if(suc){
break;
}
}
}
get()
函式用於返回私有值value
public final int get() {
return value;
}
value
在AtomicInteger物件初始化時賦值,預設為0
public AtomicInteger(int initialValue) {
value = initialValue;
}
- 地址VALUE為static final型別,一旦宣告不能更改,VALUE地址與私有變數value繫結。
private static final jdk.internal.misc.Unsafe U = jdk. internal.misc.Unsafe.getUnsafe();
private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");
- 經過原始碼的檢視,其中
atomicI.compareAndSet()
函式如下
public final boolean compareAndSet(int expectedValue, int newValue) {
/**
*這個函式的作用為將expectedValue的值與VALUE地址上的值做比較,相同則執行成功,否則失敗
*@param VALUE 地址
@param expectedValue 期望的值
@param newValue 新值
*@return 若執行成功則將expectedValue的值替換為newValue,並返回true
否則返回false
*/
return U.compareAndSetInt(this, VALUE, expectedValue, newValue);
}
JAVA中的CAS操作都是通過sun包下Unsafe類實現,而Unsafe類中的方法都是native方法,由JVM本地實現,經過繼續深入,可以發現最終CAS操作由CPU的操作
cmpxchg
實現,具體可以去了解這個操作的用法,這裡就不繼續深入了。