Thread t1 =new Thread( () -> {
map.put("a",new AtomicLong(0));
for (int i =0;i<100000;i++){
map.get("a").incrementAndGet();
}
});
t1.start();
Thread t2 =new Thread( () -> {
Map copyMap =new HashMap<>();
copyMap.putAll(map);
while (true){
for(Map.Entry entry : copyMap.entrySet()){
System.out.println(entry.getValue());
}
}
});
t2.start();
以上代码中,虽然copymap对我们的静态map值进行了一次putall,(map是静态的ConcurrentHashMap<String,AtomicLong>类型),但是随着t1线程中map中的value不断变化,即使我们只对进行了一次复制的局部变量copymap进行遍历输出,里面的值也是在不断变化的。最后将AtomicLong类型换成了Long类型,就解决了这个问题。至于原因没有找出来,也许可以理解一下对象的深浅拷贝。