2

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
     }         
   }

次のような地図を提供している図書館を知っていますか。

  1. メソッドを含む、ConcurrentMap によって提供されるような「インターフェース」を提供しputIfAbsentます。
  2. 作業するセグメントのみをロックします (ConcurrentHashMapたとえば、実装が行うように)
  3. キーがまだ存在していない場合にのみ、オプションで値を作成できるため、無駄なガベージ生成を回避できます。
  4. 最初にcontainsKeyを使用し、次にputIfAbsentを使用することを強制しませ

上記の例がaで実行できるかどうかを尋ねているのではないことに注意してくださいConcurrentMap(AFAIKはできません)。

コールバック バージョンでputIfAbsentConcurrentHashMapを拡張してオーバーロードすることを考えていましたが、残念ながら最終的なSegmentクラスを内部で使用しています。ConcurrentHashMap

車輪を再発明する前に、同様の機能を提供するマップが既に存在するかどうかを知りたい.

4

1 に答える 1

5

これは、メモ化と呼ばれる一般的な使用例です。私は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 の将来の計画では、computingMap タイプのインターフェースが標準の Java に付属することを知っていますが、残念ながら、現時点では google-collections に委譲する必要があります。

于 2012-04-15T03:59:01.510 に答える