Запрос к БД внутри ConcurrentHashMap.compute()

Запрос к БД внутри ConcurrentHashMap.compute() при условии низкой нагрузки на map, насколько это корректно ? В java doc написано про метод compute

Some attempted update operations on this map by other threads may be blocked while computation is in progress, so the computation should be short and simple, and must not attempt to update any other mappings of this Map.

Смущает фраза should be short and simple, а запрос к БД не подходит под это определение, с другой стороны это носит рекомендательных характер и то , что другие треды могут заблокироваться, приемлемо. Опять же вопрос , что будет если map начнет перестраиваться в то время как одни из compute() выполняется, наверное все треды заблокируются пока этот compute() не выполнится?


Ответы (1 шт):

Автор решения: Sergey Rebrov

should be short and simple - этим все сказано, не нужно все пихать в compute(). Операции с БД могут выполняться очень долго. ConcurrentHashMap, в отличии от HashMap имеет дополнительные сегменты. Грубо говоря 1 сегмент = 1 HashMap. Тред может получать доступ к определенному сегменту, если ваша пара key-value хранится в данном сегменте, то не нужно дополнительно блокировать остальные n сегментов. ConcurrentHashMap использует множество локеров и каждый локер управляет одним сегментом. Чем дольше сегмент будет заблокирован одним тредом, тем выше вероятность того, что другие треды будут ждать освобождения сегмента.

→ Ссылка