最近在看JMM内存模型和JUC,对于CAS操作有些疑惑:
既然CAS具有volatile的读和写的内存语义:即保证编译器和处理器对volatile变量的读-改-写操作不会重排序,保证变量以原子方式进行操作,并且处理器也会对CAS保证原子性操作(总线锁、缓存锁定、处理器自身保持顺序一致性)那为什么还会出现ABA问题?有大神能解释一下么?
CAS是compare and swap的缩写,中文翻译成比较并交换,是一种乐观锁的机制。
CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题。
1.ABA问题
2.循环时间长开销大
3.只能保证一个共享变量的原子操作。
从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
关于ABA问题参考文档: http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html
线程1:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。