どのように同期されたJavaのHashMapの値へのアクセスを作るには?

Hichem97:

のは、キーが文字列であるか、どのようなところ、私はJavaのHashMapを持ち、その値は例えば、他の値のリストであるとしましょう

Map<String,List<String>> myMap=new HashMap<String,List<String>>();
//adding value to it would look like this
myMap.put("catKey", new ArrayList<String>(){{add("catValue1");}} );

私たちは多くのスレッドを追加し、リスト(キーハッシュマップの値だけを変更していない)から値を削除した場合はリストのみスレッドセーフにアクセスするようにする方法はありますか?非常に多くのスレッドが同じ時間に多くの値を編集できること?

アンドレアス:

代わりに、同期または同時リストの実装を使用してArrayList、たとえば、

最後は、リストではありませんが、それは他のものより良好に動作するので、あなたが実際には、アクセス・バイ・インデックス(すなわちランダムアクセス)を必要としない場合に便利です。


あなたはおそらく、新しいキーのマップに最初の空のリストの同時挿入を必要とするので注意し、あなたが使用する必要があるConcurrentHashMapためMap代わりに、プレーンの、そのものHashMap


勧告

Map<String, Deque<String>> myMap = new ConcurrentHashMap<>();

// Add new key/value pair
String key = "catKey";
String value = "catValue1";
myMap.computeIfAbsent(key, k -> new ConcurrentLinkedDeque<>()).add(value);

上記のコードは完全にマップに新しいキーを追加するとき、スレッドセーフで、完全にスレッドセーフリストに新しい値を追加するときです。コードは、同期ロックを取得する時間を費やすことはありませんし、劣化を受けないCopyOnWriteArrayListリストが大きくなったときに持っています。

唯一の問題は、それが使用していることであるDeque、ではないListが、現実には、それのほとんどの用途であるListように簡単に使用することができDequeますが、指定されList、これはおそらく許容可能な変化であるので、習慣のうちに。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=18770&siteId=1