Gor*_*Ape 9 java concurrency concurrenthashmap
我从昨天开始就一直在读书,我不知道很多事情......但有些事情已经开始变得清晰......
我明白为什么双重检查锁定是不安全的(我想知道罕见情况的可行性是什么)但是volatile修复了1.5 +中的问题....
但我想知道是否会发生这种情况putifAbsent
喜欢...
myObj = new myObject("CodeMonkey");
cHashM.putIfAbsent("keyy",myObj);
Run Code Online (Sandbox Code Playgroud)
然后这确保myObj当另一个线程执行时,它将是100%的intialiased cHashM.get()??? 因为它可能有一个引用未完全初始化(双重检查锁定问题)
如果您调用concurrentHashMap.get(key)并返回一个对象,则保证该对象已完全初始化。每个 put(或 putIfAbsent)将获得一个特定于存储桶的锁,并将该元素附加到存储桶的条目中。
现在您可以查看代码并注意到 get 方法没有获得相同的锁。所以你可以争辩说可能有过时的阅读,这也不是真的。这里的原因是条目本身的值是不稳定的。所以你一定会得到最新的阅读。
putIfAbsent中的“方法” ConcurrentHashMap是“如果不设置则检查”。这是一个原子操作。但是要回答以下部分:“然后,这确保当另一个线程执行cHashM.get()时,将对myObj进行100%初始化”,这取决于将对象放入HashMap的时间。通常,优先级是发生在事件之前的,即,如果调用者在将对象放置在地图中之前首先获取,null则将被返回,否则将返回值。
| 归档时间: |
|
| 查看次数: |
5658 次 |
| 最近记录: |