CAS概念

 2024-01-13    0 条评论    699 浏览

多线程

概念

CAS是 Compare And Swap的缩写。

CAS也叫乐观锁,也称为自旋操作。

也就是多现场操作同一个变量时,为了保证原子性做的比较与交换操作。

流程如下:

  1. 某线程取变量当前值,存在临时值中。
  2. 做计算值操作(比如自增等),将值存在临时值中。
  3. 再次取变量当前值,与首次取的变量值做对比,是否发生变化。
  4. 如果第三次取值与首次取值的内容相同,说明没有其他线程修改过变量,直接将第二部计算后的值赋予变量。
  5. 如果第三次取值与首次取值的内容不同,说明期间有其他线程修改了变量,则重新从第一步再次开始

ABA问题

CAS机制会有ABA问题。

第三部与第一步的值对比,判断变量是否被其他线程修改。

但是当其他线程修改变量后又修改成原值,则当前线程无法判断变量值是否修改过。

如果只是对变量值本身操作,则无影响。如果对变量值是否变化过也需要判断,则有影响。

ABA问题可以通过增加版本号来解决,例如ES中的文本就有版本号机制,更新版本号会变化。

CAS本身线程安全问题

从CAS的逻辑看,实际上也有线程安全问题。

如果第四步骤取值对比的时候,又其他线程更改了变量,当前线程是无法感知的,依然并发不安全。

而如果再次获取变量当前值判断是否被其他线程更改,则属于永无止境的套娃行为,所以原子性最终一定是加锁实现的。只不过追求加最小开销的锁。

对于这个问题,是在底层实现的。

CAS底层实现

在java中volatile、优化后的synchronized底层都是CAS机制

而底层CAS机制实现的方法,是汇编指令

lock cmpxchg

cmpxchg实现了CAS操作

lock则指定原子性操作

多核处理器中,需要lock保证原子性,单核处理器则不需要lock(待确定)