2024-03-23  阅读(3)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1423349278

回答

CAS,Compare And Swap,即比较并交换,它一种无锁编程技术的核心机制。其工作方式分为两步:

  1. 比较:它首先会比较内存中的某个值(V)与预期的值(A)是否相等。
  2. **交换:**如果相等,那么会自动将该值(V)更新为新值(B)。如果不相等,不做任何操作。

这个过程是原子操作,保证在并发环境中的数据一致性和线程安全。

CAS 主要存在如下三个问题:

  1. ABA 问题:如果变量 V 的值原先是 A,然后被其他线程改为 B,然后又改回 A,这时CAS操作会误认为自从上次读取以来 V 没有被修改过,从而可能产生错误的操作结果。
  2. 循环时间过长问题CAS操作如果长时间不成功,会不断进行重试,这可能会导致线程长时间处于忙等(Busy-Wait)状态,从而导致 CPU 长时间做无效操作。
  3. 多变量原子问题CAS 只能保证一个变量的原子操作。

详解

CAS 详解

CAS,Compare And Swap,即比较并交换。Doug lea大神在同步组件中大量使用 CAS 技术鬼斧神工地实现了Java多线程的并发操作。整个 AQS 同步组件、Atomic 原子类操作等等都是基于 CAS 实现的,可以说CAS 是整个 JUC 的基石。

在CAS中有三个参数:内存值 V、旧的预期值 A以及要更新的值 B。它涉及两个操作:

  1. 比较:首先比较内存位置的当前值 V 和预期原值 A 是否相等,即 V == A ?
  2. 交换:如果相等则将该位置值更新为新值,即 set B → V

用伪代码表示:

if(this.value == A){
    this.value = B
    return true;
}else{
     return false;
}

流程图如下: