每日一博 | ABA问题的本质及其解决办法
简介 CAS的全称是compare and swap,它是java同步类的基础,java.util.concurrent中的同步类基本上都是使用CAS来实现其原子性的。 CAS的原理其实很简单,为了保证在多线程环境下我们的更新是符合预期的,或者说一个线程在更新某个对象的时候,没有其他的线程对该对象进行修改。在线程更新某个对象(或值)之前,先保存更新前的值,然后在实际更新的时候传入之前保存的值,进行比较,如果一致的话就进行更新,否则失败。 注意,CAS在java中是用native方法来实现的,利用了系统本身提供的原子性操作。 那么CAS在使用中会有什么问题呢?一般来说CAS如果设计的不够完美的话,可能会产生ABA问题,而ABA问题又可以分为两类,我们先看来看一类问题。 更多内容请访问www.flydean.com 第一类问题 我们考虑下面一种ABA的情况: 在多线程的环境中,线程a从共享的地址X中读取到了对象A。 在线程a准备对地址X进行更新之前,线程b将地址X中的值修改为了B。 接着线程b将地址X中的值又修改回了A。 最新线程a对地址X执行CAS,发现X中存储的还是对象A,对象匹配,C...
