CAS(Compare And Swap)流程及原理

CAS(Compare And Swap)

CAS的流程:

将数据的值读到线程的内存中,对值进行一系列的操作后,再次去比较需要改变的内存中的值,与当前线程内存中的值,是否一致?

  • 若不一致的话,证明在此过程中,其他线程有对此数据内存进行操作,重复进行对此数据的操作。
  • 若一致,则证明在此过程中,数据没有被其他线程更改过(若不考虑ABA问题),进行对数据的更新。

CAS(Compare And Swap)流程及原理

ABA问题:

在我们对数据进行CAS流程操作时,虽然数据的值仍然与我们刚刚取得的值一致,但是,我们需要知道这个值已经是经过一系列变化了,是经历了一系列中间态的。

解决方案:

为每个值定义一个版本号,每次修改一次值,就更新一次版本号,比较的时候,尽管值相同,当版本号不同,不能通过验证。

CAS到最终的汇编语言级别,是一条指令:

lock cmpxchg 指令

指令cmpxchg不能起到原子性的作用。原因是当我们去比较值之后,去写入更新值时,若此时值改变了,仍然不能解决原子性问题,lock就是为了解决这个问题。lock修饰的含义为,当我们在对这个数据的值进行修改时,其他cpu不许打断。