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を使用することを強制しません。
上記の例がaで実行できるかどうかを尋ねているのではないことに注意してくださいConcurrentMap
(AFAIKはできません)。
コールバック バージョンでputIfAbsentConcurrentHashMap
を拡張してオーバーロードすることを考えていましたが、残念ながら最終的なSegmentクラスを内部で使用しています。ConcurrentHashMap
車輪を再発明する前に、同様の機能を提供するマップが既に存在するかどうかを知りたい.