比较交换指令cmpxchg
Intel x86比较交换指令cmpxchg的作用与原理 - 掘金 https://juejin.cn/post/6905287769006800903
lock.ppt https://heather.cs.ucdavis.edu/~matloff/50/PLN/lock.pdf
https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/cmpxchg.h
cmpxchg dest,src
将AL、AX、EAX或RAX寄存器中的值与第一个操作数dest(目标操作数)进行比较。
如果两个值相等,则将第二个操作数src(源操作数)加载到目标操作数中。
如果不相等,则目标操作数被加载到AL、AX、EAX或RAX寄存器中。 RAX寄存器仅在64位模式下可用。
https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749434&idx=3&sn=5ffa63ad47fe166f2f1a9f604ed10091&chksm=bd12a5778a652c61509d9e718ab086ff27ad8768586ea9b38c3dcf9e017a8e49bcae3df9bcc8&scene=21#wechat_redirect
CAS算法涉及到三个操作数:
-
需要读写的内存值 V。
-
进行比较的值 A。
-
要写入的新值 B。
当且仅当 V 的值等于 A 时,CAS通过原子方式用新值B来更新V的值(“比较+更新”整体是一个原子操作),否则不会执行任何操作。一般情况下,“更新”是一个不断重试的操作。
后续JDK通过CPU的cmpxchg指令,去比较寄存器中的 A 和 内存中的值 V。如果相等,就把要写入的新值 B 存入内存中。如果不相等,就将内存值 V 赋值给寄存器中的值 A。然后通过Java代码中的while循环再次调用cmpxchg指令进行重试,直到设置成功为止。