
JUC
由CAS缺陷到ABA问题
谈谈什么是ABA问题:狸猫换太子
Thread
0x00, Thread0x01。0x01比0x00 用时少,同时操作主内存。由于0x01比0x00快,所以主内存中数据已经被改了。0x01再次读取内存中的值,再次修改主内存中的值。几次循环之后,0x00执行完毕,写回主内存时,主内存的值正好是期望值,然后0x00修改成功。表面上是风平浪静的,但是在0x00执行过程中,0x01已经修改过多次。 这就叫ABA问题
ABA问题是怎么产生的
CAS会导致”ABA问题“。
CAS算法实现一个重要前提需要取出内存中某时刻的数据,并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化。
具体发生过程在上面引言部分已经写过,不再赘述。
尽管线程 0x00 的操作成功,但是不代表这个过程是没有问题的。
原子引用
java.util.concurrent.atomic.AtomicReference<V>
1 | /** |
如何解决ABA问题?
- 原子引用
- 增加一种机制:修改版本号(类似时间戳)
时间戳原子引用
1 | /** |
引入了原子时间戳之后,线程执行中共享变量被修改的问题就不会逃过检测,也就保证了线程安全。