Il codice seguente è impostato per sincronizzare correttamente le chiamate 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);
}
}
}
}
Dalla mia comprensione, ho bisogno del blocco sincronizzato addToMap()
per impedire a un altro thread di chiamare remove()
o containsKey()
prima di passare la chiamata a, put()
ma non ho bisogno di un blocco sincronizzato doWork()
perché un altro thread non può entrare nel blocco sincronizzato addToMap()
prima del remove()
ritorno perché ho creato la mappa originariamente con Collections.synchronizedMap()
. È corretto? C'è un modo migliore per farlo?