Findbugs - 对 java.util.concurrent.ConcurrentHashMap 的调用序列可能不是原子的

Findbugs - Sequence of calls to java.util.concurrent.ConcurrentHashMap may not be atomic

我的项目中有以下代码

// Declaration

private ConcurrentHashMap<Long, ConcurrentHashMap<String, Object>> instanceSpecificBeanMap = new ConcurrentHashMap<>();

地图的使用

ConcurrentHashMap<String, Object> beanMapForInstance = instanceSpecificBeanMap.get(currentInstanceId);
    Object beanObject = null;
    if(beanMapForInstance == null){
        synchronized (initLockObject) {
            beanMapForInstance = instanceSpecificBeanMap.get(currentInstanceId);
            if(beanMapForInstance == null){
                beanMapForInstance = new ConcurrentHashMap<>();
                instanceSpecificBeanMap.put(currentInstanceId, beanMapForInstance);
            }
        }
    }

我认为上面的操作是原子的,尽管 findbugs 将其显示为问题?我在这里遗漏了什么吗?

编辑

beanMapForInstance 只能从此 class 访问。没有其他 class 可以访问此变量。

此外, 目前我们正在使用 Java 7

使用putIfAbsent方法。如果给定键存在none,则恰恰是为了原子地在映射中放置一个新值。

ConcurrentHashMap<String, Object> newMap = new ConcurrentHashMap<>();
ConcurrentHashMap<String, Object> beanMapForInstance = instanceSpecificBeanMap.putIfAbsent(currentInstanceId, newMap);
if (beanMapForInstance == null) {
    beanMapForInstance = newMap;
}
(... work with beanMapForInstance ...)

您可以简化此问题并使用 Java 中的 computeIfAbsent 解决问题 8:

ConcurrentHashMap<String, Object> beanMapForInstance = 
        instanceSpecificBeanMap.computeIfAbsent(
            currentInstanceId, 
            k -> new ConcurrentHashMap<>()  // might need explicit generics
        );