Java中的CAS粗浅理解
CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。它使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。可以说CAS是一种乐观锁,但它仍然存在一些缺点。如ABA问题,自旋锁消耗问题,多变量共享一致性问题
ABA问题:
问题描述:线程t1将它的值从A变为B,再从B变为A。同时有线程t2要将值从A变为C。但CAS检查的时候会发现没有改变,但是实质上它已经发生了改变,可能会造成数据的缺失。
解决方案:可以给数据加一个版本号或者时间戳,如AtomicStampedReference。
自旋消耗资源:
问题描述:多个线程争夺同一个资源时,如果自旋一直不成功,将会一直占用CPU。
解决方法:破坏掉for死循环,当超过一定时间或者一定次数时,return退出。
多变量共享一致性问题:
问题描述:CAS一次针对的是一个变更,当多个共享变量时,无法使用一次CAS解决。
解决方法:CAS操作是针对一个变量的,如果对多个变量操作,1. 可以加锁来解决。2 .封装成对象类解决。