CAS

118 阅读1分钟

CAS(Compare and swap)

CAS有三个操作数,当前值A、内存值V、要修改的新值B

image.png

  1. 如果V==A,将A修改为B
  2. 如果V!=A,什么都不做(或重试)

将当前值与内存值进行对比,判断是否有被修改过,这就是CAS的核心。

CAS相当于没有加锁,多个线程都可以直接操作共享资源,在实际去修改的时候才去判断能否修改成功,在很多情况下会比synchronized锁高效,比如对一个值进行累加,就没必要使用synchronized锁,使用JUC包下的Automic类就足够。

CAS缺点(ABA)

image.png

image.png

解决方法:

Java提供了AtomicStampedReference类供我们使用,实际上就是加了一个版本,比对的就是内存值+版本是否一致。