什么是CAS机制?
一句话就是:在没有锁的状态下,可以保证多个线程对一个值的更新
优势:响应时间短
CAS算法的执行过程
- 读取内存位置的当前值。
- 对当前值进行计算,计算完成后检查内存中当前值是否仍为读取的值
- 如果相等,则将新值写入内存位置。如果写入成功,则CAS操作成功
- 如果不相等,则表示其他线程已经修改了该内存位置的值,CAS操作失败。
- 如果操作失败,则返回第一步,重新尝试。
接下来举一个例子进行示范:
例子概述:一个线程现在需要把一个值1改为2,但是只能在该值基础上进行增1操作
-
第1步:现在读取当前值1,然后进行加1运算,
-
第2步:计算结束后与当前的该值比较,如果该值仍为1,则将+1后的值赋给它变成2,如果当前值已经不是1了,那么就是被其他线程修改过了,此时肯定不可以将1赋给该值,需要重新读取
-
第3步:读取被其他线程修改过的该值,进行计算,然后再和该值进行对比
-
重复以上过程
CAS操作是原子的,即整个读取、比较和更新操作在执行期间不会被其他线程中断或修改,保证了多线程环境下的数据一致性和线程安全性。
CAS算法衍生的ABA问题
什么是ABA问题?
概述:当线程1将一个值从0改成1时,在其计算的这段时间里,有其他线程将该值从0改为1又改为0,而线程1是不知道的,此时的0已经不是之前的0了
解决方法:给值加一个版本号,每次修改增加版本号或者用bool标记一下,都可以