CAS原理及其附带的问题

发布时间 2023-03-22 21:16:20作者: 懒懒初阳

CAS(Compare-And-Swap)

是一种原子操作,用于实现多线程同步。在Java中,Atomic系列的类通过CAS实现了并发实现。

CAS操作包含三个参数:内存地址V、旧的预期值A、新的值B。当且仅当预期值A和内存地址V中的值相同时,才进行更新和替换。否则不执行任何操作。

CAS操作原理如下:

  1. 读取当前内存地址V的值;
  2. 对比内存地址V的值是否等于预期值A,如果不相等,则认为其他线程已经修改了该值;如果相等,则执行第三步操作;
  3. 将新值B写入到内存地址V中;
  4. 返回操作是否成功。

CAS操作保证了在多线程环境下,对内存的读取和写入是原子性的,避免了数据的冲突和同步问题。但是也存在ABA问题,即一个值从A变为B再回到A,在这个过程中,CAS无法检测到数据已经被修改过了,因此可以使用AtomicStampedReference解决。

AtomicStampedReference

  • 原理使用stamp 生成版本号
  • 结合内存值比对、版本比对解决ABA问题

CAS带来三大问题

CAS(Compare and Swap)就是比较并交换,可以实现多线程环境下的无锁同步。其原理是在执行变量更新时,先比较当前内存中的值是否与预期值相同,若相同,则执行修改操作;否则终止修改操作。Android中,CAS常用来实现脏标记(Dirty Flag)模式、乐观锁以及Atomic类型等。CAS带来以下三大问题:

  1. ABA问题

  2. 自旋时间过长

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