如图,代码如下,运行结果有重复
代码红框区域改为下图,不在重复,想请问一下各位这是什么原因呢,应该怎么分析思考呢?
非常感谢
如图,代码如下,运行结果有重复
代码红框区域改为下图,不在重复,想请问一下各位这是什么原因呢,应该怎么分析思考呢?
非常感谢
收起
是这样的,这里涉及到 JVM 的内存模型的 Happens-Before 的规则。
第一种直接打印 count 的做法,写入完成后,可能这个写入的值不会立即被其他线程看到,所以打印的重复了。
可以理解为内存信息延迟,增加的值只暂时存储在线程自己的内存中,没有同步到全局用户内存中,所以有些线程看不到最新的值。
第二种先用 temp 读取操作时,此时涉及到读取,所以 Happend-Before 规则中的写入操作必须在对变量的读操作之前,所以 temp 是最新的值。
其实这是 volatile 的用法,你把第一种写法的定义改成这样:
private static volatile AtomicInteger count = new AtomicInteger(0);
会强制刷新公共内存的信息,就看到的不是重复的了。
报告相同问题?