【发布时间】:2015-12-12 02:42:25
【问题描述】:
ConcurrentHashMap 支持原子getOrDefault(Object key, V defaultValue),即
返回指定键映射到的值,如果此映射不包含该键的映射,则返回给定的默认值。
我的问题是:
我如何通过提供原子操作来增强
ConcurrentHashMap,比如getOrDefaultWithPut(Object key, V defaultValue),"返回指定键映射到的值,或者先把给定的默认值放入map中,如果这个map包含则返回默认值没有键映射。`"
我的解决方案:
目前我有一个Wrapper 类
private ConcurrentMap<K, V> map = new ConcurrentHashMap<>();
方法是:
public synchronized K getOrDefaultWithPut(K key, V defaultValue)
{
map.putIfAbsent(key, defaultValue);
return map.get(key);
}
- 这个实现是线程安全的吗?
synchronized有必要吗?如果去掉会有什么坏处?- 如果
getOrDefaultWithPut(K key, V defaultValue)是Wrapper的唯一公共方法,那么此实现是否是线程安全的并且synchronized是否必要?
【问题讨论】:
-
通过使用同步,您似乎失去了并发哈希映射内部提供的所有并行性。此外,您应该在方法中使用 getOrDefault。只有当有人删除了语句 map.putIfAbsent 和 map.getOrDefault 之间的键时,您的代码才不起作用,在这种情况下,您将获得一个默认值,但键不会出现在 map 中(可以是理想情况下也是正确的,具体取决于您的用例)
标签: java collections synchronized java.util.concurrent concurrenthashmap