Выбор ответа Middle java.util.concurrent и виртуальные потоки обновлено
null в ConcurrentHashMap
Вопрос
Почему ConcurrentHashMap не разрешает null в ключах и значениях?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Иначе null из get не отличить от отсутствия ключа атомарно. В однопоточном HashMap неоднозначность null решается вызовом containsKey.
Варианты ответа
- Из-за того, что null нельзя захешировать и положить в корзину
- Это ограничение HashMap, которое ConcurrentHashMap унаследовал
- null занимал бы отдельную блокировку и тормозил все корзины
- Иначе null из
getне отличить от отсутствия ключа атомарноправильный ответ
Разбор
В однопоточном HashMap неоднозначность null решается вызовом containsKey. В конкурентной карте между get и containsKey другой поток мог изменить данные, поэтому автор Дуг Ли запретил null совсем. HashMap null-ключ как раз разрешает (хеш null равен 0), так что дело не в хешировании и не в наследовании.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «java.util.concurrent и виртуальные потоки»
- Что выведет: цепочка CompletableFuture
- В каком потоке выполнится thenApply
- Гонка на ConcurrentHashMap
- Опасность newFixedThreadPool
- CountDownLatch и CyclicBarrier
- Устройство ConcurrentHashMap
- ReentrantLock и synchronized
- Виртуальные потоки