Czy poniższy kod jest skonfigurowany, aby poprawnie zsynchronizować połączenia 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);
}
}
}
}
Z mojego zrozumienia potrzebuję zsynchronizowanego bloku, addToMap()
aby uniemożliwić wywołanie innego wątku remove()
lub containsKey()
zanim przejdę przez wywołanie, put()
ale nie potrzebuję zsynchronizowanego bloku, doWork()
ponieważ inny wątek nie może wejść do zsynchronizowanego bloku addToMap()
przed remove()
powrotem, ponieważ pierwotnie utworzyłem mapę z Collections.synchronizedMap()
. Czy to jest poprawne? Czy jest lepszy sposób, aby to zrobić?