2

私は、キーとして文字列を持ち、というListを持つ同期HashMapを持っていれば、リストを値として扱います。並行性:値としてのHashMapとリスト

Map<String, List<Object>> map = Collections.synchronizedMap(new HashMap<String, List<Object>>()); 

このリストはスレッドセーフであろうか?たとえば、私がこれを行う場合:

List<Object> list = map.get("whatever"); // Supposing I get a List 
list.add(new Object()); // Would this be thread-safe? 

そうでない場合、同期されたものではなく、ConcurrentHashMapを使用しますか?競合状態を避ける唯一の方法は、それをCopyOnWriteArrayListに変換することですか?

+0

いいえ、 'synchronizedMap()'と 'ConcurrentHashMap'の両方に対して' Map'だけがスレッドセーフです。 – Andreas

+1

'list'オブジェクトに要素を追加していますが、同期マップとはまったく関係がありません。リスト自体は、同期されたコレクションでなければなりません。 – radoh

+0

'Map'が与えられたキーの' List'をまだ持っていない場合はどうしますか? 'get()'呼び出しと 'put()'呼び出しの間で世界が変わったかもしれないので 'map.put()'だけを呼び出すことはできません。 – Andreas

答えて

4

Collections.synchronizedMapは、結果のマップに対してスレッドセーフを提供します。

Collections.synchronizedList(yourList) 

し、それらをマップに追加する:あなたは、マップ値のようなあなたのリストを飾るない理由をスレッドセーフにしたい場合は?

+0

私はそれを期待していました、私はちょうどそれについて確信していたので、CopyOnWriteArrayList – xBlackout

関連する問題