CAS 乐观锁和ABA问题

CAS====》Compare-And-Swap

如果主物理内存的值跟线程期望值一样,就修改为我的更新值,不一样,就失败,需要重新获取主物理内存的值
CAS 乐观锁和ABA问题
CAS 乐观锁和ABA问题
底层基于usafe,而这个类是rt.jar包sun.misc.unsafe原生类,靠的里面cpu原语保证原子性,工作思想还是靠的cas,比较和交换
CAS的缺点:
1.循环时间长开销大
2.只能保证一个共享变量的原子操作
3.会产生ABA问题

“ABA问题”
简称狸猫换太子

CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化。比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且线程two进行了一些操作将值变成了B,然后线程two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后线程one操作成功。
尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的

模拟ABA问题
原子引用更新AtomicReference<> 自定义原子
CAS 乐观锁和ABA问题
CAS 乐观锁和ABA问题
ABA解决
AtomicStampedReference<> 原子引用带上版本号
CAS 乐观锁和ABA问题
CAS 乐观锁和ABA问题
CAS 乐观锁和ABA问题