Ist der folgende Code so eingerichtet, dass die Anrufe korrekt synchronisiert werden 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);
}
}
}
}
Nach meinem Verständnis benötige ich den synchronisierten Block addToMap()
, um zu verhindern, dass ein anderer Thread aufruft remove()
oder containsKey()
bevor ich den Aufruf erhalte, put()
aber ich benötige keinen synchronisierten Block, doWork()
da ein anderer Thread den synchronisierten Block addToMap()
vor der remove()
Rückkehr nicht eingeben kann, da ich die Map ursprünglich erstellt habe mit Collections.synchronizedMap()
. Ist das korrekt? Gibt es einen besseren Weg, dies zu tun?