1、定义:
无锁定算法指一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。
2、CAS算法:
包含3个操作数:内存位置V、预期原值A、新值B,如果V和A相同,则V更新为新值B;CAS通过调用JNI的代码实现的。JNI:Java Native Interface为JAVA本地调用,允许java调用其他语言
public class SimulatedCAS {
private int value;
public synchronized int getValue() {
return value;
}
public synchronized int compareAndSwap(int expectedValue, int newValue) {
if (value == expectedValue)
value = newValue;
return value;
}
}
3、CAS的弊端:
1)ABA问题:如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。
2)循环时间长开销大:自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销
3)只能保证一个共享变量的原子操作:对多个共享变量操作时,循环CAS就无法保证操作的原子性
4、原子变量类
原子变量类可以认为是volatile变量的泛化,它扩展了volatile变量的概念,来支持原子条件的比较并设置更新。它使用平台上可用的最快本机结构来实现,包括AtomicInteger、AtomicLong、AtomicReference、AtomicBoolean等