2016-02-15 1 views
6

キーバインドされたクリティカルセクションを保護するためのキーごとのロック機構が必要です。weakValues()を使ったGuavaのキャッシュ<K、Semaphore>はスレッドセーフなのでしょうか?

ConcurrentMap<K, Semaphore>でも並行性は十分ですが、マップに古いキーが累積されて無期限に成長することも望ましくありません。

理想的には、データ構造は、ロックが使用されていないキーに使用されるメモリを最終的に(またはまっすぐに)解放します。

私は一種のグアバのCacheweakValues()で構築されたが、トリックを行うだろうと思っています:

private static final LoadingCache<K, Semaphore> KEY_MUTEX = CacheBuilder.newBuilder() 
     .weakValues() 
     .build(new CacheLoader<K, Semaphore>() { 
      @Override 
      public Semaphore load(K key) throws Exception { 
       return new Semaphore(1); 
      } 
     }); 

が、これは十分な同時実行制御を提供しない場合がありますなぜいずれかの理由がありますか?

これは、未使用のペアがガベージコレクションされない原因ではないのでしょうか?

答えて

3

はい、それはうまくいくでしょう。

このユースケースの多かれ少なかれ設計されたデータ構造もあります:Striped

+1

'com.google.common.util.concurrent.Striped' *はキーごとの同期オブジェクトを保証しないことに注意してください。複数のキーで同じオブジェクトを共有することができ、これにより並行性が低下する可能性があります。したがって、 'Striped'はデザイン/ユースケースによっては実行可能なオプションかもしれません。 – antak

関連する問題