0

かなり一般的な質問ですが、アドバイスをお願いします。

私はサーブレットを持っています。

このサーブレットにはプライベート フィールドがあります。

プライベート フィールドは一種のメタデータです (public class Metadata{//bla-bla-bla})。

GETリクエストが処理されると、このメタデータを使用して何らかの操作が実行されます。

同じサーブレットに POST メソッドを実装したい。ユーザーがファイルをアップロードすると、メタデータ フィールドが更新されます。

問題: 1 つのサーブレット インスタンスを使用して、複数の Web スレッド間で共有される Metadata オブジェクトを使用して、このプライベート フィールドに同時にアクセスします。POST メソッド操作 (メタデータ オブジェクトの更新) により、メタデータの不整合状態が発生し、同時 GET 要求が失敗する可能性があります。

質問: GET リクエストの実行中に Metadata オブジェクトを更新する最良の方法は何ですか?

ダミーソリューション

  1. 各 GET リクエストの間、最初に

  2. メタデータ オブジェクトを同期し、1 つのブロックに複製してから解放します。

  3. 同時 GET リクエストは、一貫性のある Metadata オブジェクトのクローン バージョンで動作します。

  4. 各 POST リクエスト中。

  5. メタデータ オブジェクトを同期し、そのフィールドを更新します。

  6. Metadata オブジェクトを解放します。

アドバイスや批判をお願いします。

4

1 に答える 1

1

Metadata クラスで同期メソッド set および get を使用することは問題ありませんが、複数のリーダーがあり、ライターが (はるかに) 少ない場合は、Web アプリが遅くなる可能性があります。

Java Synchronized キーワードは、オブジェクトの排他ロックを取得するために使用されます。スレッドが読み取りまたは書き込みのためにオブジェクトのロックを取得すると、他のスレッドはそのオブジェクトのロックが解放されるまで待機する必要があります。共有データを頻繁に読み取る読み取りスレッドが多数あり、共有データを更新する書き込みスレッドが 1 つしかないというシナリオを考えてみてください。書き込み操作がない限り、複数の読み取り操作を並行して実行できるため、読み取り中に共有データへのアクセスを排他的にロックする必要はありません。

(その素敵な投稿からの抜粋)

したがって、同じ Java5 ReadWriteLockインターフェイス ドキュメントでも説明されているように、場合によっては、複数の読み取り、単一の書き込み戦略を使用する方がパフォーマンスの面で優れている場合があります。

読み取り/書き込みロックを使用すると、共有データにアクセスする際に、相互排除ロックで許可されるよりも高いレベルの同時実行が可能になります。一度に 1 つのスレッド (ライター スレッド) だけが共有データを変更できる一方で、多くの場合、任意の数のスレッドがデータを同時に読み取ることができる (したがってリーダー スレッド) という事実を利用します。理論的には、読み取り/書き込みロックを使用することで許可される同時実行数の増加は、相互排除ロックの使用よりもパフォーマンスの向上につながります。実際には、この同時実行性の向上は、共有データのアクセス パターンが適切な場合にのみ、マルチプロセッサで完全に実現されます。

読み取り/書き込みロックが相互排他ロックの使用よりもパフォーマンスを向上させるかどうかは、データが変更される場合と比較して読み取られる頻度、読み取り操作と書き込み操作の期間、およびデータの競合に依存します。つまり、同時にデータの読み取りまたは書き込みを試行するスレッドの数です。たとえば、最初にデータが取り込まれ、その後はほとんど変更されず、頻繁に検索されるコレクション (ある種のディレクトリなど) は、読み取り/書き込みロックを使用する理想的な候補です。ただし、更新が頻繁になると、データはほとんどの時間を排他的にロックされることに費やされ、同時実行性はほとんど向上しません。さらに遠く、読み取り操作が短すぎると、読み取り/書き込みロックの実装 (相互排除ロックよりも本質的に複雑) のオーバーヘッドが実行コストを支配する可能性があります。コードの。最終的には、プロファイリングと測定によってのみ、読み取り/書き込みロックの使用がアプリケーションに適しているかどうかを確認できます。

すぐに使用できる実装はReentrantReadWriteLockです。

使い方については、以前の投稿をご覧ください。

于 2012-11-12T21:45:50.550 に答える