所以我有这个代码,其中 lockMap 是ConcurrentHashMap
//Creation of locks
Lock getLock(String key) {
Lock lock = lockMap.get(key);
if (lock == null) {
synchronized (lockMap) {
lock = lockMap.get(key);
if (lock == null) {
lock = new ReentrantLock();
lockMap.put(key, lock);
}
}
}
return lock;
}
在代码审查期间,有人提到这是 DCL 的典型案例,因为由于编译器可以对事件进行重新排序,因此锁在插入映射时可能尚未完全初始化,那么下一个请求相同锁的线程可能可能尚未完全初始化。
现在,我遇到的问题是这个问题是多线程应用程序的常见问题:从地图中获取一些东西,如果没有,则创建并添加。
- 这真的是DCL的案例吗?
- 如果是这样,你如何解决它。(我们使用的简单而愚蠢的方法是创建一个锁池,当从池中提取一个锁时,插入一个新锁)
- 如果又是这样,它是否已在 java8 中修复