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 также выполняет блокировку на уровне сегмента.