什么是CAS算法
CAS:Compare and Swap 比较再交换
CAS有三个操作数:内存地址V,旧的预期值A,即将要更新的目标值B
CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做,整个比较并替换的过程就是一个原子操作。
CAS的缺陷
循环时间长,开销大
只能保证一个共享变量的原子操作
ABA问题
循环时间长,开销大:
如果CAS失败,会一直进行尝试。如果CAS失败,会一直进行尝试。如果CAS一直不成功,那么会给CPU带来巨大的开销
只能保证一个共享变量的原子操作
当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但对多个共享变量操作时,循环CAS无法保证操作的原子性,这个时候就可以用锁来保证原子性。
什么是ABA问题?ABA问题如何解决?
如果内存地址V初次读取的值就是A,并且在准备赋值的时候检查它的值仍然为A,那我们就能说它的值没有被其他线程修改过了吗?
如果在这个时间段它的值曾经被改成了B,后来又被改回为A,那么CAS操作就会误认为它从来没有改变过。这就是ABA问题。
要解决ABA问题,可以增加一个版本号,当内存位置V的值每次修改后,版本号都加1