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

喜欢...

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

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

最佳答案

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

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

10-05 21:38