CAS(compare and swap比较并且交换 )
作用:在不使用锁的情况下支持多线程,CAS又被称作:轻量级锁,无锁,自旋锁(很形象,后续会解释)
整体过程(举例:多线程情况下实现对某个数字A实现加1操作)
首先读取这个数字A当前值,执行+1操作获得结果值A+1,接下来会进行比较并且交换操作:将原先读取的当前值与当前新值进行比较,相等再进行替换操作,用结果值替换原先的值,不相等会重复执行以上步骤,这一步自旋的过程呼应上面说的自旋锁
存在的问题:
1、虽然我们比较结果相同,但是会不会在交换的时候数据已经被改过了;
解释:先说结论,CAS比较并且交换在汇编层面是通过一条指令来执行,lock cmpxchg(重点),lock保证执行比较并且交换过程是一个原子性的操作;
2、我们比较数据是否相等,有没有可能多个线程对数据已经进行修改,导致我们判断数据没有变化;
解释:有可能,ABA这个名词也是因此命名,针对这个问题,有些情况没有影响,有些情况有影响;
解决的办法:版本控制或者直接设置Boolean的flag记录数据有没有被修改过;