CAS是什么

CAS全称为Compare and Swap,又或者被称为 Compare and exchange,直译过来就是比较与交换,其功能是实现了线程安全的数值的递增。

CAS的工作流程

众所周知,通过i++而进行的数值的递增,由于递增不是原子性操作,在并发情况下会导致错误,从而是线程不安全的。CAS实现了线程安全的数值递增,是如何实现的呢?其流程如下图:
Java高并发基础之CAS
CAS是在对数值递增时,获取到需要进行操作的数E,然后计算数值递增后的结果V,之后再取即将更新值N与E进行对比。若相等,就将值更新为V;若不相等,再进行这次操作循环,直至实现递增,从而结束。
CAS为什么是线程安全?假如在这个线程刚将N于E进行比较且得到结果相等之后,在将其值修改之前有另一个线程将该值修改了,这样不就是线程不安全的吗?
在底层CAS的操作是对应一个底层lock comxchg指令。comxchg指令即compare and exchange,但是这条指令并不是原子性的,lock指令的作用是在执行后面的指令的时候锁定一个北桥信号,这又可以被称为内存屏障。就是为了保障在它进行比较和替换的过程中不会别的线程对其操作。

ABA问题

ABA问题,首先直接来看ABA,从A变成B再又变成A,即在对新老数值进行对比之前,已经有别的线程对值进行修改多次但是值没发生变化,会导致CAS认为其没有发生变化。对于这个问题,可以通过对其添加版本号,在比较数值的同时进行版本号的比较,从而去确定是否被修改过。

相关文章:

  • 2021-10-14
  • 2021-09-20
  • 2021-11-20
猜你喜欢
  • 2021-12-23
  • 2021-06-10
  • 2021-07-16
  • 2021-05-03
  • 2021-05-18
相关资源
相似解决方案