次のコードは、の呼び出しを正しく同期するように設定されていsynchronizedMap
ますか?
public class MyClass {
private static Map<String, List<String>> synchronizedMap = Collections.synchronizedMap(new HashMap<String, List<String>>());
public void doWork(String key) {
List<String> values = null;
while ((values = synchronizedMap.remove(key)) != null) {
//do something with values
}
}
public static void addToMap(String key, String value) {
synchronized (synchronizedMap) {
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
}
else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
synchronizedMap.put(key, valuesList);
}
}
}
}
私の理解では、addToMap()
別のスレッドが呼び出されないようにするため、remove()
またはcontainsKey()
呼び出しを通過する前にput()
同期ブロックをdoWork()
入力する必要がありますが、最初にマップを作成したため、戻るaddToMap()
前に別のスレッドが同期ブロックに入ることができないため、同期ブロックを入力する必要はありませんremove()
とCollections.synchronizedMap()
。あれは正しいですか?これを行うためのより良い方法はありますか?