¿Está configurado el siguiente código para sincronizar correctamente las llamadas 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);
}
}
}
}
Según tengo entendido, necesito el bloque sincronizado addToMap()
para evitar que otro subproceso llame remove()
o containsKey()
antes de realizar la llamada a, put()
pero no necesito un bloque sincronizado doWork()
porque otro subproceso no puede ingresar al bloque sincronizado addToMap()
antes de las remove()
devoluciones porque creé el mapa originalmente con Collections.synchronizedMap()
. ¿Es eso correcto? ¿Hay una mejor manera de hacer esto?