Установлен ли следующий код для правильной синхронизации вызовов на 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(). Это верно? Есть ли лучший способ сделать это?