CAS与ABA问题

4,383 阅读1分钟

什么是CAS

CAS全程为compare-and-swap,它是一条cpu并发原语;他的功能是判断某个位置的值是否是预期值,如果是,更新预期值,这个更新操作是原子性的

CAS并发原语体现在JAVA中就是sum.misc.Unsafe类中的各个方法,调用Unsafe类中的各个方法,JVM会帮忙实现CAS汇编指令。这是依赖硬件功能,实现原子操作。CAS是一种系统原语,系统原语属于硬件范畴,由若干条指令组成,用于完成某个功能的过程,原语的执行必须是连续的,所以CAS就是一条系统的原子指令,不会造成数据不一致问题。



ABA问题

ABA问题的根本在于CAS在修改变量的时候,无法记录变量的状态,比如修改的次数,否修改过这个变量。这样就很容易在一个线程将A修改成B时,另一个线程又会把B修改成A,造成casd多次执行的问题。

解决ABA问题

AtomicStampReference 

通过stamp这个标记属性来记录cas每次设置值的操作,而下一次再cas操作时,由于期望的stamp与现有的stamp不一样,因此就会设值失败,从而杜绝了ABA问题的复现。

//参数代表的含义分别是 期望值,写入的新值,期望标记,新标记值public boolean compareAndSet(V expected,V newReference,int expectedStamp,int newStamp);public V getRerference();public int getStamp();public void set(V newReference,int newStamp);