HashMapをユーザーに返すアプリケーションを作成しています。ユーザーはこのMAPへの参照を取得します。バックエンドでは、マップを更新するいくつかのスレッドを実行します。
これまでにやったことは?
すべてのバックエンドスレッドを作成したので、MAPを更新するために共通のチャネルを共有します。したがって、バックエンドでは、同時書き込み操作が問題にならないことを確信しています。
私が抱えている問題
今まで私はそのような問題に直面していませんでしたが、私は将来直面するかもしれないことを恐れています。提案をお願いします。
私は使っている ConcurrentHashMap<String, String>.
ConcurrentHashMap
を使用して正しい軌道に乗っています。各ポイントについて:
putIfAbsent
と replace
は両方ともスレッドセーフであり、ハッシュマップの現在の状態のチェックと1つのアトミック操作への更新を組み合わせています。_Collections.synchronizedMap
_ のようなConcurrentHashMap
の利点は、従来のMap putIfAbsent
およびget
ロジックを提供するput
のような結合メソッドです内部的に同期された方法。これらのメソッドを使用して、do notは機能しないため、ConcurrentHashMap
を介して独自のカスタム同期を提供しようとします。 _Java.util.concurrent
_コレクションは内部的に同期され、他のスレッドはオブジェクトの同期の試行に応答しません(例:synchronize(myConcurrentHashMap){}
は他のスレッドをブロックしません)。
サイドノート:
Cliff Clickによるロックフリーハッシュテーブルの実装を確認することをお勧めします。これは Highly Scalable Java ライブラリの一部です
(これは Googleトーク by Cliff Clickです。このロックフリーハッシュについてです。)
ConcurrentHashMapは、説明するシナリオに関する問題を回避するために設計および実装されました。心配する必要はありません。
取得の完全な並行性と、updates.updatesの調整可能な予想される並行性をサポートするハッシュテーブル。