В Java 8 ConcurrentHashMap
изменена логика для использования блокировок уровня сегмента вместо блокировок уровня сегмента.
В чем разница?
В Java 7Карта была разделена между сегментами, каждый из которых сам по себе является одновременно читаемой хэш-таблицей.Каждый сегмент содержит некоторое количество сегментов внутри.
Сам блок является списком / массивом пар ключ-значение.
Количество потоков, работающих с картой параллельно, было ограничено количествомсегменты.
В Java 8 уровень блокировки был перемещен на уровень сегмента, в то время как сегменты были удалены (это все еще в коде, но без использования).
Так, в основном, в Java 7вставка блокировала несколько сегментов, в Java 8 - только один.
Еще одна причина, по которой это было сделано, заключается в том, что количество потоков, работающих параллельно с картой, может увеличиваться при увеличении размера карты (большеведра - больше ниток).В Java 7 размер сегментов был фиксирован, и его нельзя было изменить без воссоздания карты.