다음 코드가 호출을 올바르게 동기화하도록 설정되어 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()
. 그 맞습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?