У меня есть одновременная хэш-карта в некотором классе обслуживания:
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
вызовов, однако для достижения того, что я хочу, мне понадобятся дополнительные блокировки.