关注
volatile方式的i++,总共是四个步骤: i++实际为load、Increment、store、Memory Barriers 四个操作。 内存屏障是线程安全的,但是内存屏障之前的指令并不是.在某一时刻线程1将i的值load取出来,放置到cpu缓存中,然后再将此值放置到寄存器A中(寄存器A中保存的是中间值,没有直接修改i,因此其他线程并不会获取到这个自增1的值),然后A中的值自增1。如果在此时线程2也执行同样的操作(在线程1的寄存器中的i自增前),获取值i==10,自增1变为11,然后马上刷入主内存。此时由于线程2修改了i的值,实时的线程1中的i==10的值缓存失效(缓存一致性协议),重新从主内存中读取,变为11(但此时寄存器中的值是不会再刷新了)。接下来线程1恢复,寄存器中的i进行自增。将自增过后的A寄存器值11赋值给cpu缓存i,最终结果是11,而不是预计的两次自增12。这样就出现了线程安全问题。 链接:https://www.zhihu.com/question/329746124/answer/1205806238 是不是这样的,大家讨论讨论
点赞
相关推荐
06-04 18:03
河南工程学院 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 26届的你们有几段实习? #
20510次浏览 277人参与
# 你小时候最想从事什么职业 #
102815次浏览 1771人参与
# 你被哪些公司秒挂过? #
19052次浏览 185人参与
# 网申一定要掌握的小技巧 #
9704次浏览 65人参与
# 如何提高实习转正率? #
7701次浏览 135人参与
# 新凯来求职进展汇总 #
41079次浏览 108人参与
# 你认为哪些项目算烂大街? #
8579次浏览 196人参与
# 机械校招之路总结 #
92468次浏览 1889人参与
# 你后悔自己读研吗? #
9227次浏览 178人参与
# 你以为的实习VS真实的实习 #
11968次浏览 133人参与
# 月薪多少能在一线城市生存 #
11094次浏览 172人参与
# 腾讯工作体验 #
480036次浏览 3498人参与
# 找工作时的取与舍 #
81359次浏览 578人参与
# 最难的技术面是哪家公司? #
6126次浏览 58人参与
# 秋招拿一个offer可以躺平吗 #
145023次浏览 928人参与
# 安利/避雷我的专业 #
77796次浏览 526人参与
# 面试等了一周没回复,还有戏吗 #
137227次浏览 1229人参与
# 你想留在一线还是回老家? #
50129次浏览 513人参与
# 选择和努力,哪个更重要? #
86076次浏览 745人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
115020次浏览 799人参与