原理
CAS通过调用JNI的代码实现的。而compareAndSwapInt就是借助C来调用CPU底层指令实现的。
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); |
缺点:
ABA问题
解决1:使用版本号或者时间戳;
解决2:Java1.5开始在atomic包中提供一个类AtomicStampedReference来解决ABA问题,这个类的compareAndSet方法中首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
循环时间长开销大
只能保证一个共享变量的原子操作
可以使用Java1.5开始提供的AtomicReference来包装多个变量,或者使用Synchronized。