CAS,即Compare And Swap,比较交换,即先比较实际值与期望值是否一致,一致的话就将新值替代旧值,且这个过程是原子的
联想到乐观锁,它也是先操作,在比较实际值与期望值是否一致,不一致则操作失败,重新尝试或者报错。
还有,Atomic包下的原子类,也有这种比较交换的思想
还有ConcurrentHashMap中,也有用到CAS算法,比如put方法中
CAS最底层的实现是一条比较交换指令,由于是一条指令,就保证了线程安全
缺点:
1. ABA问题:一个值,原本是A,线程1开始操作,得知值为A,这时线程2将值改为B,线程3改为A,这时线程1准备修改值,判断实际值与期望值为一致,故修改。如果你是想在线程1操作时,其他线程不能做修改,即使最后改为原值,那么CAS就不能满足这种需求。
在数据库的乐观锁中,还加了版本号,即,如果线程2操作了,那么版本号+1,最后线程1发现版本号变了,故修改失败
2. 自旋可能会过久