关于CAS原子性的疑问

会不会有这种场景:

如有一个值为3

A线程想把他更新成4,先比较期望值是不是3,比较完后,正要进行替换操作。线程被切了。

线程B成功把3变成5

线程A恢复后,执行替换操作又把它变成了4。

总得来说CAS是如何保证 比较和替换 这两个操作是原子性的。

#Java开发#
全部评论
比较和更新是一个原子操作
点赞 回复 分享
发布于 2021-06-04 17:29
    asm volatile("lock cmpxchg %[new], %[ptr]"         :"+a"(expected), [ptr] "+m"(*addr)         :[new] "r"(new_value)         :"memory"); 在Intel X86-64架构中,cmpxchg指令用于比较与置换指定的地址与值。它先比较地址addr中存储的值与寄存器%eax中的值,如果相等则将new_value存入地址addr中,否则将addr中存储的数据读入寄存器%eax中。通过给这条指令加上lock前缀,Intel处理器可以保证上述比较与置换操作的原子性。
点赞 回复 分享
发布于 2021-06-05 15:12
cas是硬件指令,由cpu保证原子性
点赞 回复 分享
发布于 2021-06-07 10:25
比较交换这是个原子操作,底层用的是汇编指令(intel)lock compxchg
点赞 回复 分享
发布于 2021-06-09 19:28

相关推荐

2024-12-31 17:16
北京邮电大学 golang
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务