『阿里巴巴』Java并发编程之CAS第三篇-CAS的缺点( 三 )


我们来看看 , 使用带有时间戳的原子引用类解决ABA问题的代码:
1:声明共享变量
static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(1271);
(需要说明 , 如果用数值做demo的话 , 主要int的取值范围 。 如果大于127 , 就会始终返回false 。 因为 Integer(128) == Integer(128)返回的是false)
线程一先修改执行一个ABA的过程:
编辑
执行完成之后 , 当前的主内存中版本号应该是3了 。
我们在用线程2来执行compareAndSet:
此时 , 在线程2中的版本号:tamp应该是1 , 但是主内存中的版本号已经是3了 。 所以执行后返回false.执行不成功的 。
我们来看看运行结果和我们预期结果:
运行结果 , 和我们预期结果是一致的 。 说明 , 添加这个时间戳(版本号)可以解决ABA问题