Запутался в разнице между поведением ConcurrentHashMap и HashMap в этом примере - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь понять, как работает ConcurrentHashMap.Я нашел пример, но я не могу его понять.Вот его код:

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) {
    myData.remove(key);
}

Это вызовет исключение ConcurrentModificationException во время выполнения.

Однако этот код, использующий ConcurrentHashMap, будет работать правильно:

Map<String, Object> myData = new ConcurrentHashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) }
    myData.remove(key);
}

Может кто-нибудь объяснить мне, почему ConcurrentHashMap позволяет удалять ключи, в то время как HashMap выдает исключение?Спасибо

1 Ответ

0 голосов
/ 19 февраля 2019

Это только одна из особенностей ConcurrentHashMap.Чтобы процитировать из документов:

Аналогично, Итераторы, Сплитераторы и Перечисления возвращают элементы, отражающие состояние хеш-таблицы в некоторой точке во время или после создания итератора / перечисления.Они не выдают исключение ConcurrentModificationException. Однако

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

Если это ваша единственная причина для использования ConcurrentHashMap, то вам, вероятно, следует пересмотреть, потому что это намного дороже, чем HashMap.Вам лучше всего сделать копию набора ключей, прежде чем использовать его следующим образом:

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for(String key: myData.keySet().toArray(new String[0]))
    myData.remove(key); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...