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

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

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

图片说明

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

非常感谢

  • 写回答

1条回答 默认 最新

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

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

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

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

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

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

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

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗