关于CAS原子性的疑问

会不会有这种场景:

如有一个值为3

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

线程B成功把3变成5

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

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

#Java开发#
全部评论
比较交换这是个原子操作,底层用的是汇编指令(intel)lock compxchg
点赞 回复 分享
发布于 2021-06-09 19:28
cas是硬件指令,由cpu保证原子性
点赞 回复 分享
发布于 2021-06-07 10:25
    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
比较和更新是一个原子操作
点赞 回复 分享
发布于 2021-06-04 17:29

相关推荐

04-02 10:09
门头沟学院 Java
用微笑面对困难:这里面问题还是很多的,我也不清楚为啥大家会感觉没啥问题。首先就是全栈开发实习9个月的内容都没有java实习生的内容多,1整个技术栈没看出太核心和难点的内容,感觉好像被拉过去打杂了,而且全栈基本上很容易被毙。里面能问的bug是在太多了比如L:继承 BaseMapper 可直接使用内置方法’。请问你的 BaseMapper 是如何扫描实体类注解如果瞬时产生 100 个上传任务,MySQL 的索引设计是否会有瓶颈?你做过分库分表或者索引优化吗?全栈的内容可以针对动态难点去搞,技能特长写在下面吧,你写了这么多技能,项目和实习体现了多少?你可以在项目里多做文章然后把这个放下去,从大致来看实习不算太水,有含金量你也要写上内容针对哨兵里面的节点变化能问出一万个问题,这个很容易就爆了。
提前批简历挂麻了怎么办
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务