Блокировка чтения и повторного входа для определенного значения - PullRequest
0 голосов
/ 16 октября 2018

Мое приложение получает много входящих HTTP-запросов.В заголовке каждого запроса есть пара ключ-значение.

Say Header1 = App1

Значение App1 продолжает изменяться.

Итак, следующим может быть App2, App3 и т. П.

.Однако эти значения могут продолжать поступать в любом порядке.Мне нужно обработать состояние гонки, при котором, если приходит несколько запросов с App1, я получаю

ReentrantReadWriteLock

на App1.Одновременно, если я получу запрос на App2, я получу ReentrantReadWriteLock для App2.Обе блокировки должны быть взаимоисключающими, в противном случае у меня будет узкое место в производительности, при котором, если не будет выполнена логика App1, приложение App2 не будет выполнено.

Что я пытаюсь сделать, если приходит несколько запросов для App1, то они имеютждать.Одновременно, если получен запрос для App2, он будет выполнен параллельно с текущим запросом App1.По сути синхронизировать по уникальным значениям.Я на самом деле невежественен.Цените руководство.PS Я не могу использовать синхронизированный, так как это приведет к узким местам производительности

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете использовать ConcurrentMap для сопоставления ключей запроса с блокировками, например:

ConcurrentMap<String, ReentrantLock> locks = ...

ReentrantLock lock = locks.computeIfAbsent(key, k -> new ReentrantLock());
lock.lock();
// do work
lock.unlock();
...