CAS

原理

CAS通过调用JNI的代码实现的。而compareAndSwapInt就是借助C来调用CPU底层指令实现的。

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

缺点:

  1. ABA问题

    解决1:使用版本号或者时间戳;

    解决2:Java1.5开始在atomic包中提供一个类AtomicStampedReference来解决ABA问题,这个类的compareAndSet方法中首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

  2. 循环时间长开销大

  3. 只能保证一个共享变量的原子操作

    可以使用Java1.5开始提供的AtomicReference来包装多个变量,或者使用Synchronized。

Author: Jiayi Yang
Link: https://jiayiy.github.io/2020/06/24/CAS/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.