6
キーバインドされたクリティカルセクションを保護するためのキーごとのロック機構が必要です。weakValues()を使ったGuavaのキャッシュ<K、Semaphore>はスレッドセーフなのでしょうか?
ConcurrentMap<K, Semaphore>
でも並行性は十分ですが、マップに古いキーが累積されて無期限に成長することも望ましくありません。
理想的には、データ構造は、ロックが使用されていないキーに使用されるメモリを最終的に(またはまっすぐに)解放します。
私は一種のグアバのCache
weakValues()
で構築されたが、トリックを行うだろうと思っています:
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);
}
});
が、これは十分な同時実行制御を提供しない場合がありますなぜいずれかの理由がありますか?
これは、未使用のペアがガベージコレクションされない原因ではないのでしょうか?
'com.google.common.util.concurrent.Striped' *はキーごとの同期オブジェクトを保証しないことに注意してください。複数のキーで同じオブジェクトを共有することができ、これにより並行性が低下する可能性があります。したがって、 'Striped'はデザイン/ユースケースによっては実行可能なオプションかもしれません。 – antak