Aşağıdaki kod, çağrıları doğru şekilde senkronize etmek için ayarlanmış synchronizedMapmı?
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);
}
}
}
}
Anladığım kadarıyla, addToMap()başka bir iş parçacığının çağrılmasını önlemek için remove()veya çağrıyı containsKey()geçmeden önce put()senkronize edilmiş bloğa ihtiyacım var , ancak senkronize bir bloğa ihtiyacım yok doWork()çünkü başka bir iş parçacığı addToMap()dönmeden önce senkronize edilmiş bloğa giremiyor remove()çünkü Haritayı orijinal olarak oluşturdum ile Collections.synchronizedMap(). Bu doğru mu? Bunu yapmanın daha iyi bir yolu var mı?