ConcurrentHashMap гарантирует

У меня есть параллельная хэш-карта в некотором классе обслуживания:

class MyClass implements Flushable {
   private volatile ConcurrentHashMap<Integer, Object> hashMap = ...

   public void add(int id, Object value) {
      hashMap.put(id, value);
   }

   @Override
   public void flush() throws IOException {
      hashMap.foreach((k, v) -> ...)
      hashMap.clear();
   }

}

Нужно ли делать дополнительную блокировку, чтобы убедиться, что: 1. flush обработает все записи карты (что, если add вызывается между foreach и clear?) 2. clear не удалит записи, которые были вставлены / обновлены после foreach

От javadoc есть гарантия, что обновление произойдет до прочтения. Итак, насколько я понимаю clear будет блокировать put вызовы, однако, чтобы достичь того, что я хочу, мне нужны некоторые дополнительные блокировки.

1 ответ

В вашем случае вам нужна дополнительная блокировка, обе операции должны быть заблокированы, метод clear также выполняет блокировку на уровне сегмента.

Другие вопросы по тегам