【发布时间】:2012-04-26 21:32:20
【问题描述】:
我想使用与ConcurrentMap 等效的映射(我想要与 putIfAbsent 方法等效的映射),但这不会强迫我事先创建对象。
例如当我这样做时:
m.putIfAbsent( key, new CyclingArray() );
我最终可能会创建一个新的 CyclingArray(不管是什么)对象。
当然,我知道我可以锁定整个地图,但这将打败ConcurrentMap 的全部意义。
在概念上可以像下面这样工作吗?
m.putIfAbsent( key, new Callback<CyclingArray>() {
@Override
public CyclingArray provide() {
return new CyclingArray(); // only called if the key wasn't already present
}
}
您是否知道任何提供地图的图书馆:
- 提供类似于 ConcurrentMap 提供的“接口”,包括
putIfAbsent方法。 - 只锁定我们将要使用的段(例如,
ConcurrentHashMap实现) - 允许选择性地创建值,当且仅当键不存在时,从而避免无用的垃圾生成。
- 不强迫我先使用 containsKey,然后使用 putIfAbsent,因为这在某种程度上也违背了 putIfAbsent 的目的。
请注意,我不是询问是否可以使用 ConcurrentMap 完成上述示例(它不能 AFAIK)。
我正在考虑扩展 ConcurrentHashMap 并使用回调版本重载 putIfAbsent,但遗憾的是 ConcurrentHashMap 在内部使用了最终的 Segment 类。
在重新发明轮子之前,我想知道是否有任何地图已经提供了类似的功能。
【问题讨论】:
标签: java concurrency map garbage