web-dev-qa-db-ja.com

スレッドセーフハッシュマップ?

HashMapをユーザーに返すアプリケーションを作成しています。ユーザーはこのMAPへの参照を取得します。バックエンドでは、マップを更新するいくつかのスレッドを実行します。

これまでにやったことは?


すべてのバックエンドスレッドを作成したので、MAPを更新するために共通のチャネルを共有します。したがって、バックエンドでは、同時書き込み操作が問題にならないことを確信しています。


私が抱えている問題


  1. ユーザーがMAPを更新しようとし、同時にMAPがバックエンドで更新されている場合->同時書き込み操作の問題。
  2. UseがMAPから何かを読み取ろうとし、同時にMAPがバックエンドで更新されている場合->同時読み取りおよび書き込み操作の問題。

今まで私はそのような問題に直面していませんでしたが、私は将来直面するかもしれないことを恐れています。提案をお願いします。

私は使っている ConcurrentHashMap<String, String>.

40
user381878

ConcurrentHashMap を使用して正しい軌道に乗っています。各ポイントについて:

  1. メソッドを確認してください putIfAbsentreplace は両方ともスレッドセーフであり、ハッシュマップの現在の状態のチェックと1つのアトミック操作への更新を組み合わせています。
  2. get メソッドは内部的に同期されませんが、利用可能な指定されたキーの最新の値を返します( ConcurrentHashMapクラスのJavadocの議論 を確認してください)。

_Collections.synchronizedMap_ のようなConcurrentHashMapの利点は、従来のMap putIfAbsentおよびgetロジックを提供するputのような結合メソッドです内部的に同期された方法。これらのメソッドを使用して、do notは機能しないため、ConcurrentHashMapを介して独自のカスタム同期を提供しようとします。 _Java.util.concurrent_コレクションは内部的に同期され、他のスレッドはオブジェクトの同期の試行に応答しません(例:synchronize(myConcurrentHashMap){}は他のスレッドをブロックしません)。

53
krock

サイドノート:

Cliff Clickによるロックフリーハッシュテーブルの実装を確認することをお勧めします。これは Highly Scalable Java ライブラリの一部です

(これは Googleトーク by Cliff Clickです。このロックフリーハッシュについてです。)

8
miedwar

ConcurrentHashMapは、説明するシナリオに関する問題を回避するために設計および実装されました。心配する必要はありません。

取得の完全な並行性と、updates.updatesの調整可能な予想される並行性をサポートするハッシュテーブル。

ConcurrentHashMapのjavadoc

0
Moisei