CAS
概念
compare and swap:比較和交換
作用
硬件級別支持的比較&交換的原子操作
//僞代碼 ,早期以下整段代碼是不具備原子操作的 是線程不安全的
if(a == oldValue){
a = newValue
}
這段代碼在以前是不具備原子操作的,硬件升級後,具備了原子能力
java應用
- Unsafe類
public static Unsafe getUnsafe() {
Class var0 = Reflection.getCallerClass();
//類加載限定不允許用戶自己調用
if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
throw new SecurityException("Unsafe");
} else {
return theUnsafe;
}
}
//CAS原子操作類
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
底層的sun.misc.Unsafe類中實現了native方法,供java底層調用,而用戶無法調用,
java.util.concurrent.atomic原子包
原子包下的內容核心就是使用Unsafe類來實現的線程安全,以AtomicReference類爲例,其實大致都差不多
/**只是確保了原子操作
*多線程情況下 如果值已經被其他線程改了就有可能交換不成功
*不成功就直接return false了
*/
public final boolean compareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}
/**確保了原子操作
*多線程情況下 如果值已經被其他線程改了就有可能交換不成功
*不成功就反覆重試,如果競爭激勵 則可能多次自旋
* @since 1.8
*/
public final V getAndUpdate(UnaryOperator<V> updateFunction) {
V prev, next;
do {
prev = get();
next = updateFunction.apply(prev);
} while (!compareAndSet(prev, next));
return prev;
}