Чи встановлений наступний код для коректної синхронізації дзвінків 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()
. Це правильно? Чи є кращий спосіб це зробити?