我尝试使用具有以下行为的ConcurrentHashMap创建方法。
我的想法。
private Object lock1 = new Object();
private ConcurrentHashMap<String, Object> productMap;
private Object getProductMap(String name) {
if (productMap.isEmpty()) {
productMap = new ConcurrentHashMap<>();
}
if (productMap.containsKey(name)) {
return productMap.get(name);
}
synchronized (lock1) {
if (productMap.containsKey(name)) {
return productMap.get(name);
} else {
Product product = new Product(name);
session.save(product);
productMap.putIfAbsent(name, product);
}
}
}
有人可以帮我理解这是否是正确的方法?
答案 0 :(得分:1)
这里有几个错误。
productMap
无法保证初始化,那么您在此方法的第一个声明中会得到NPE
。putIfAbsent
哪一半完成你的目标。ConcurrentHashMap
对于您的目的而言是线程安全的。如果我要改写这个,我会做一些不同的事情:
ConcurrentHashMap
ConcurrentMap
而不是具体类(所以ConcurrentMap<String, Product> productMap = new ConcurrentHashMap<>();
)将方法重命名为putIfMissing
并委托给putIfAbsent
,如果结果为null
,则使用一些逻辑返回我想添加的相同记录。以上绝对取决于具有定义明确的Product
和equals
方法的 hashCode
,以便new Product(name)
将生成具有相同值的对象equals
和hashCode
如果提供相同的name
。
使用Optional
来避免任何结果为putIfAbsent
的NPE,并提供更容易理解的代码。
以上的片段:
public Product putIfMissing(String key) {
Product product = new Product(key);
Optional<Product> result =
Optional.ofNullable(productMap.putIfAbsent(key, product));
session.save(result.orElse(product));
return result.orElse(product);
}