为什么ConcurrentHashMap.putifAbsent是安全的? - java

从昨天开始,我一直在阅读有关一致性的文章,但我并不了解很多事情。但是,有些事情开始变得清晰起来了……
我知道为什么双重检查锁定并不安全(我想知道发生这种罕见情况的可能性是什么),但volatile在1.5 +中解决了该问题。
但我想知道这是否与putifAbsent一起发生

喜欢...

myObj = new myObject("CodeMonkey");
cHashM.putIfAbsent("keyy",myObj);  

然后这样做是否确保在另一个线程执行myObjcHashM.get()可以100%初始化?因为它可能没有完全初始化一个引用(双重检查锁定问题)

参考方案

如果调用concurrentHashMap.get(key)并返回一个对象,则可以保证该对象已完全初始化。每个put(或putIfAbsent)将获得存储桶特定的锁,并将该元素附加到存储桶的条目中。

现在您可以遍历代码,并注意get方法不会获得此相同的锁。因此,您可以争辩说可能存在过时的读取,也不是事实。这是因为条目本身中的值是易变的。因此,您将确保获得最新的阅读资料。

45码