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
);
我的项目中有以下代码
// 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
);