@GuanSQ 2019-07-21 12:37 采纳率: 0%
浏览 1016
已采纳

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

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

图片说明

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

非常感谢

  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2019-07-22 01:48
    关注

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

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

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部