CompareAndSet/CompareAndSwap
比较并交换,是一种乐观锁。Unsafe这个类提供的能力,从原语上支持了原子性。
jdk1.8是不支持直接使用Unsafe的,通过反射可以获取到unsafe对象。
public class TestCas {
public static void main(String[] args) throws Exception {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
long offset = unsafe.allocateMemory(1);
Integer i = 0;
unsafe.putInt(i, offset, 5);
System.out.println("1======="+unsafe.getInt(i, offset));
int cnt = 2;
while (!unsafe.compareAndSwapInt(i, offset, 1, 5)){
int anInt = unsafe.getInt(i, offset);
unsafe.compareAndSwapInt(i, offset, anInt, anInt-1);
System.out.println("执行减1");
System.out.println((cnt++) +"======="+unsafe.getInt(i, offset));
}
System.out.println(cnt+"======="+unsafe.getInt(i, offset));
unsafe.freeMemory(offset);
}
}