0

次のシナリオで、きめの細かいロック メカニズムを作成しようとしています。

Cache内部に多くのシリアル化されたオブジェクトを含むデータ ストアがあります。それぞれCacheが特定の人、グループ、または会社に属しており、それぞれCacheを 4 つの方法のいずれかで変更できます: 作成、削除、削除、または挿入できます。aCacheが変更されている間、私はそれへのアクセスをブロックしたいと思います。それぞれは、便宜上、ディレクトリとファイル名、およびフル パスを格納Cacheするオブジェクトを使用して識別されます。CacheLocation

現在、処理中の現在のオブジェクトRequestQueueを保持するというクラス内で配列リストを使用しています。CacheLocation次に、別のスレッドが入ってくると、キューをチェックして、CacheLocation要求しているスレッドが既に使用されているかどうかを確認します。この場合、while ループを使用して、CacheLocationそこに置かれたリクエストによって削除されるまで、定期的に をチェックし続けます。

CacheLocationに対するキーの HashMap を持つことはアイデアかもしれないと考えていました。BlockingQueueこれにより、BlockingQueueオブジェクトのセットが大きくなりますが、キューをかなりうまく管理できました。

この種の細粒度ロックを行うためのより良い方法はありますか?

4

2 に答える 2

1

私があなたの説明を正しく理解していれば、デザインをかなりシンプルに保つ方法の 1 つは次のとおりです。

  • a を使用しConcurrentHashMap<CacheLocation, Cache>てキャッシュを保存します ( CacheLocations は不変であるか、少なくとも決して変更されないと仮定します)
  • CacheLocation関連するオブジェクトをロックして、キャッシュへのすべてのアクセスを確実に保護してください
于 2013-05-13T11:44:03.667 に答える
0

別の非ブロッキング (ただし潜在的に遅い) アプローチもあります。

map.compute(someId, (key, value) -> {
  // atomic access to cache
  return null;
});

ここで私の関連する質問と回答を読んでください

于 2016-09-24T17:55:23.720 に答える