のは、キーが文字列であるか、どのようなところ、私は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
、たとえば、
new Vector()
(同期)new ConcurrentLinkedDeque<>()
(同時ではありませんList
)
最後は、リストではありませんが、それは他のものより良好に動作するので、あなたが実際には、アクセス・バイ・インデックス(すなわちランダムアクセス)を必要としない場合に便利です。
あなたはおそらく、新しいキーのマップに最初の空のリストの同時挿入を必要とするので注意し、あなたが使用する必要がある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
、これはおそらく許容可能な変化であるので、習慣のうちに。