作为多线程的基石之一,作为java.util.concurrent.*的底层方法之一,理解CAS是十分重要的。
首先,CAS,即是compare and swap,是一种乐观锁。顾名思义,其核心思想在于:现在有三个操作数:内存值A,旧的预期值a,新的值B。
1.compare:比较A与a是否相等;
如果不等,说明被更改过,则不更新,返回false表示修改失败;
如果相等,则到第2步;
2.swap:更新A的值为B。
但是这会出现经典的ABA问题,即对于内存值A来说,你在compare的时候,a->b->a,由于最后变回了A,在检查的时候以为没变过(实际上被改过了)。
为了解决这个问题,JDK1.5引入AtomicStampedReference,其核心思想是每次修改都伴随版本号的变更。核心代码如下,其中Stamp即是版本号: