CAS
2021-06-10 10:09:10 0 举报
关于 CAS 的底层实现 以及可能存在的问题
作者其他创作
大纲/内容
结束
J9
汇编语言实现
自旋CAS,如果一直循环执行,一直不成功,会给CPU带来非常大的执行开销。很多时候,CAS思想体现,是有个自旋次数的,就是为了避开这个耗时问题~
更新为新值 V
Jrocket
Hotspot
开源版本 openJDK
北桥芯片就是主板上离CPU最近的芯片,这主要是考虑到北桥芯片与处理器之间的通信最密切,为了提高通信性能而缩短传输距离。
ABA 问题
JVM 实现的不同版本
相等
只能保证一个变量的原子操作
读取当前值 E
CAS保证的是对一个变量执行操作的原子性,如果对多个变量操作时,CAS目前无法直接保证操作的原子性的。
TaobaoVM
CAS问题
比较 E 和当前新值 N
硬件级别:lock 指令在执行后面指令的时候锁定一个北桥信号(不采用锁总线的方式)
cmpxchg
并发环境下,假设初始条件是A,去修改数据时,发现是A就会执行修改。但是看到的虽然是A,中间可能发生了A变B,B又变回A的情况。此时A已经非彼A,数据即使成功修改,也可能有问题。想象一下你的女朋友跟你分手之后又经历了别的男人,之后又跟你复合了……
可以通过AtomicStampedReference解决ABA问题,它是一个带有标记的原子引用类,通过控制变量值的版本来保证CAS的正确性。
其他线程修改为不同值
循环时间长开销
jdk8u: atomic_linux_x86.inline.hpp
其他线程修改数次最后值和原值相同
lock cmpxchg
也可以通过加版本号,来判断是否中间经历了别的线程修改。
可以通过这两个方式解决这个问题:1. 使用互斥锁来保证原子性;2. 将多个变量封装成对象,通过AtomicReference来保证原子性。
开始
……
不相等
计算结果值 V
0 条评论
回复 删除
下一页