CAS语义上存在的ABA 问题
什么是ABA问题?
假设第一次读取V地址的A值 然后通过CAS来判断V地址的值是否仍旧为A如果是就将B的值写入V地址覆盖A值
但是语义上有一个漏洞当第一次读取V的A值此时内存V的值变为B值 然后在未执行CAS前 又变回了A值
此时CAS再执行时会判断其正确的并进行赋值
这种判断值的方式来断定内存是否被修改过针对某些问题是不适用的
为了解决这种问题jdk 并发包提供了AtomicStampedReference(有标记的原子引用)类通过控制变量值的版本来保证CAS正确性
其实大部分通过值的变化来CAS已经够用了
jdk原子包介绍(基于volatile)
包的特色
普通原子数值类型AtomicIntegerAtomicLong提供一些原子操作的加减运算
使用了解决髒数据问题的经典模式比对后设定即查看主存中数据是否与预期提供的值一致如果一致才更新
使用AtomicReference可以实现对所有对象的原子引用及赋值包括Double与Float
但不包括对其的计算浮点的计算只能依靠同步关键字或Lock接口来实现了
对数组元素里的对象符合以上特点的也可采用原子操作包里提供了一些数组原子操作类
AtomicIntegerArrayAtomicLongArray等等
大幅度提升系统吞吐量及性能
[] [] [] []