我想使用一个等同于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
}
}
您知道任何提供地图的图书馆:
putIfAbsent
方法。ConcurrentHashMap
实现)请注意,我不询问上述示例是否可以使用ConcurrentMap
(它不能是AFAIK)完成。
我在考虑使用回调版本扩展ConcurrentHashMap
并重载 putIfAbsent 但遗憾的是ConcurrentHashMap
内部使用了最终的 Segment 类。
在重新发明轮子之前,我想知道是否有任何地图已经提供了类似的功能。
答案 0 :(得分:5)
这是您正在寻找的常见用例,称为memoization。我会看MapMaker
您可以创建一个computingMap并将创建函数放在那里:
ConcurrentMap<Key, CyclingArray> graphs = new MapMaker()
.concurrencyLevel(32)
.makeComputingMap(
new Function<Key, CyclingArray>() {
public CyclingArray apply(Key key) {
return new CyclingArray(); // only called if the key wasn't already
}
});
此处Function
仅在Key
不存在时才会被调用
而且我确实知道Java中的未来计划有一个computeMap类型接口将带有标准Java,不幸的是,此时你将不得不委托google-collections。