Блокировка или неблокирование - добавление элемента во время перефразирования в HashMap в Java - PullRequest
0 голосов
/ 15 мая 2018

Как указано в документации по HashMap, когда HashMap заполнен на 75%, HashMap внутренне выполняет перехеширование всех существующих объектов.

Если при выполнении перефразирования добавляется какой-либо элемент ->

  • Есть ли у нас блокирующее поведение HashMap? - Значит перефразировка сначала закончится, потом будет добавлен элемент.

или

  • Есть ли у нас неблокирующее поведение HashMap - Перефразирование средств позволит добавить элемент между процессами перефразировки.

Как HashMap обрабатывает добавление нового элемента во время перефразировки?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Он не блокирует, но он также «не позволяет добавлять элементы между процессами перефразирования». java.util.HashMap задокументировано как небезопасный поток. Если вы попытаетесь добавить или удалить карту, пока она перефразируется, вы будете получить противоречивые поведения.

Возможно, вы захотите использовать java.util.concurrent.ConcurrentHashMap.

0 голосов
/ 15 мая 2018

Из Javadoc :

Обратите внимание, что эта реализация не синхронизирована .Если несколько потоков обращаются к хэш-карте одновременно, и хотя бы один из потоков структурно изменяет карту, она должна быть синхронизирована извне.

Необходимо применить внешнюю синхронизацию;в противном случае состояние карты может быть повреждено при доступе несколькими потоками.

Если вы синхронизируете, никакой другой элемент не может быть добавлен, пока карта перестраивается.

Если выне синхронизируются, вы не используете класс, как описано в документации, поэтому поведение не определено.

...