guanbingchichi
@GuanSQ
2019-07-21 20:37
采纳率: 16.7%
浏览 617
已采纳

关于AtomicInteger多线程中自增重复的问题

如图,代码如下,运行结果有重复图片说明

图片说明

代码红框区域改为下图,不在重复,想请问一下各位这是什么原因呢,应该怎么分析思考呢?图片说明图片说明

非常感谢

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • wojiushiwo945you
    毕小宝 2019-07-22 09:48
    已采纳

    是这样的,这里涉及到 JVM 的内存模型的 Happens-Before 的规则。
    第一种直接打印 count 的做法,写入完成后,可能这个写入的值不会立即被其他线程看到,所以打印的重复了。
    可以理解为内存信息延迟,增加的值只暂时存储在线程自己的内存中,没有同步到全局用户内存中,所以有些线程看不到最新的值。

    第二种先用 temp 读取操作时,此时涉及到读取,所以 Happend-Before 规则中的写入操作必须在对变量的读操作之前,所以 temp 是最新的值。

    其实这是 volatile 的用法,你把第一种写法的定义改成这样:

    private static volatile AtomicInteger count = new AtomicInteger(0);
    

    会强制刷新公共内存的信息,就看到的不是重复的了。

    点赞 评论

相关推荐