CAS分析(一)

栏目:线程与并发 作者:admin 日期:2017-04-23 评论:0 点击: 1,988 次

CAS(Compare And Swap)指的是现代 CPU 广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。

简单介绍一下这个指令的操作过程:首先,CPU 会将内存中将要被更改的数据与期望的值做比较。当这两个值相等时,CPU 才会将内存中的数值替换为新的值,否则便不做操作。最后,CPU 会将当前变量的真实值返回。这一系列的操作是原子的。

CAS是一种乐观锁的思路,它相信在它修改之前,没有其它线程去修改它。而synchronized是一种悲观锁,它认为在它修改之前,一定会有其它线程去修改它,悲观锁效率很低。

虽然CAS的效率很高,但是CAS会引发ABA问题:
(1)进程P1在共享变量中读到值为A
(2)P1被抢占了,进程P2执行
(3)P2把共享变量里的值从A改成了B,再改回到A,此时被P1抢占。
(4)P1回来看到共享变量里的值没有被改变,于是继续执行。
虽然P1以为变量值没有改变,继续执行了,但是这个会引发一些潜在的问题。ABA问题在地址重用方面影响很大,而地址被重用是很经常发生的,一个内存分配后释放了,再分配,很有可能还是原来的地址,但是地址所指向的内存内容已经变了。