Уведомления
Очистить всё

ConcurrentHashMap.computeIfAbsent() и дедлоки в Java 11


Viwo
Сообщения: 2
 Viwo
Автор темы
(@viwo)
New Member
Присоединился: 7 месяцев назад

При реализации многопоточности в высоконагруженном сервисе столкнулся с неочевидным поведением ConcurrentHashMap в Java 11: при использовании метода computeIfAbsent в условиях интенсивной конкуренции потоков возникают дедлоки, что связано с тем, что реализация этого метода в версиях до Java 9 была неатомарной и могла блокировать сегменты карты дольше ожидаемого, если функция отображения выполняла тяжелые операции или рекурсивно обращалась к той же мапе; решение проблемы — либо замена на отдельную проверку get и последующую вставку через putIfAbsent в цикле, либо миграция на Java 17, где этот баг исправлен на уровне JVM.


Поделиться: