2017-04-11 9 views
0

75件以上のリクエストがあり、それぞれがマップを更新またはアクセスしようとしています。そして、MAPを更新しているときにコードのブロックを同期させるとどうすればいいですか?その後、パフォーマンスの問題が発生する可能性があります。このシナリオで同期を回避するにはどうすればよいですか?

MAP、75+のリクエストを同時に更新する方法をお勧めします。

注:上記の考えをJavaで実装しようとしています。

+0

スレッドセーフマップが必要な場合は、同時に複数回アクセスできないため、パフォーマンス上の問題があります。 – BackSlash

答えて

1

それに対処するための複数の方法が最良のあなたに合ったものを見る、があります。

SynchronizedMap のConcurrentHashMapが

あなたはConcurrentHashMapのを使用している場合は要求の数を増やすことができ、あなたがないので、それはあなたのために良くなりますパフォーマンスのオーバーロードを参照してください。 ConcurrentHashMapの場合、ConcurrentHashMapの特定のセクションでロックが取得されます。つまり、2つのスレッドが別々の2つのセクションにアクセスしようとしている場合、待機せずに別々のセクションにアクセスすることができます。

1

concurrent hash mapをお試しください。基本的にはハッシュマップをより小さな範囲で分割し、マップ全体にロックをかけるのではなく、より小さな範囲でのみロックを行います。

ハッシュマップでsynchronizedブロックを使用すると、完全ハッシュマップにロックが設定され、2回の書き込み操作は同時に実行できません。しかし、同時ハッシュマップを使用し、2つの書き込み操作が異なる範囲にある場合、両方が同時に実行できます。

理解を深めるために使用する前にhow concurrent hash map worksを参照してください。

編集:ハッシュマップと同時ハッシュマップのシングルおよびマルチスレッドアプリケーションのパフォーマンスゲインをここにお読みくださいPerformance ConcurrentHashmap vs HashMap

1

一度に75件程度のリクエストが、同時にMapにアクセスするさまざまな方法の間に顕著なパフォーマンスの差異を引き起こすことはほとんどありません。最も重要なのは、コードの単純さと保守性です。 java.util.ConcurrentHashMapは、あなたが記述しているスケールで性能上の利点を発揮することはまずありませんが、他のソリューションよりも扱いがはるかに簡単です。

0

ConcurrentHashMapの既存の回答とともにいくつかの追加のパースペクティブを追加します。多くのリクエストがタイプの読み込みであり、ごく少数のリクエストが更新リクエストである場合、java.util.concurrent.locks.ReadWriteLockを見ることができます。これは、複数のスレッドがリソースを読み込めるようにしますが、一度に1つしか読み込めません。更新要求が複数の場合、以前の回答で提案されているようにConcurrentHashMapを使用できます

関連する問題