CompareAndSwap,比较并交换。
主要是通过处理器的指令来保证操作的原子性,它主要包含三个变量:
- 内存地址变量
- 旧的预期值 A
- 准备设置的新值 B
如果一个线程需要修改一个共享变量,那先要拿出它的值赋给A,然后再基于A进行业务逻辑执行,得到新值B后,再拿原预期值(原来A的值)和共享变量比较,如果相同就认为其他线程没有修改共享变量,才能将B写入内存
CAS的缺点
- CPU开销大:在高并发量的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,又因为自旋锁自旋的的时候会一直占用CPU,造成CPU的浪费。
- ABA 问题:线程 A 去修改 1 这个值,成功。但是中间线程 B 也修改了这个值,但修改后的结果也是 1,所以不影响 A 的操作,这就会有问题。可以用版本号来解决这个问题(也是乐观锁的一种具体实现)。
- 只能保证一个共享变量的原子性