Вопрос проверяет понимание тонкой синхронизации, конкурентных коллекций и корректной работы с локами по ключу.
ConcurrentHashMap безопасен для одновременного доступа из нескольких потоков.
Он позволяет атомарно создавать объекты синхронизации по ключу.
Операции чтения и записи масштабируются без глобальной блокировки.
Это делает его подходящим для fine-grained locking по ID.
Риск гонок при создании локов минимизируется.
Идея блокировки по ID требует надёжного хранилища для объектов синхронизации.
ConcurrentHashMap — это потокобезопасная реализация Map, оптимизированная для высокой конкуренции.
HashMap не подходитПри одновременном доступе:
возможны гонки при добавлении локов
состояние карты может быть повреждено
требуется внешняя синхронизация, что сводит на нет пользу
ConcurrentHashMapнеблокирующие чтения
сегментированная или CAS-синхронизация записей
высокая пропускная способность
Object lock = locks.computeIfAbsent(id, k -> new Object());
Что здесь важно:
объект создаётся один раз
нет состояния гонки
несколько потоков получают один и тот же lock
блокировка по entity ID
сериализация операций над ресурсом
защита критических секций без глобального лока
ConcurrentHashMap — естественный выбор для хранения локов по ключу в многопоточной среде.