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 是不是这样的,大家讨论讨论
点赞

相关推荐

07-11 10:56
门头沟学院 Java
码客明:大胆的说自己能实习6个月就行
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务