1.名称
Campare and swap(switch)
2.作用
保证单个变量操作的原子性
3.对比synchronized关键字
3.1 synchronized是悲观锁;当并发量很少的时候效率很低;当并发量很高的时候效率不错
3.2 CAS是乐观锁;当并发量很少的时候效率不错;当并发量很高的时候就会因为大量的自旋操作而占用cpu
4.CAS具体操作
首先该操作有三个操作数:地址,目标结果,期待结果。
当目标结果和期待结果不一样的时候会进行自旋操作。
在对变量执行操作的时候底层应该是调用了Safe类里面的pake,unpake进行加锁。
5.CAS上下文
上层应该是Lock类,各个原子类
下层应该是Safe类
6.缺点
1.CPU开销较大
在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。
2.不能保证代码块的原子性
CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3个变量共同进行原子性的更新,就不得不使用Synchronized了。
3.ABA问题
这是CAS机制最大的问题所在。
什么是ABA问题?怎么解决?我们下一期来详细介绍。
咳咳,ABA问题就是三个线程同时执行
线程A 100——>99
线程B 100——>99
线程C 99——>100
理论上只有线程AC执行成功了;
但结果是AC都执行成功后,B也执行成功了。
解决办法:
AtomicStampedReference,给地址V添加一个版本号的信息