CAS
简介
简单来说,CAS是一种操作,Java的很多方法实现了这种操作,我们通常习惯性把这些方法也叫做CAS
那么,CAS具体指的是什么操作呢?
操作
CAS全称是比较并替换(Compare and Swap)
,它的名字其实就是它的操作:
- 读取
地址Ad
所存的值B - 我们给定三个值:
- 地址
Ad
,这个地址可以存数据 - 我们认为这个地址应该存放的值
B
- 要替换的值
C
- 地址
- 比较
Ad
处所存的值和B
,如果相等,就把Ad
存的值换成C
,这一步说明Ad
地址没有被修改(但真的是这样吗) - 如果不相等,回到3重新比较,直到相等为止再替换(通常使用的是while循环)
乐观锁与悲观锁
CAS其实是一种乐观锁的实现
所谓的悲观锁就是,锁机制会认为Ad
的值在我们进行操作时,一定会有很多线程同时访问Ad
,这时使用的锁就要时刻保证同步性,会导致锁很繁重,比如synchronize
乐观锁就是认为不一定会有很多线程同时访问Ad
,所以他不会时刻保证同步性,锁就轻量
CAS的问题
- CPU压力
从第四步操作我们能发现,如果一直比较都不相等的话就会导致它不断重新比较,CPU压力很大,这也是CAS所带来的问题之一 - ABA问题