Java: точная блокировка зерна для запросов?
Я пытаюсь создать механизм точной блокировки зерна для следующего сценария:
У меня есть хранилище данных со многими сериализованными Cache
объекты внутри него. каждый Cache
принадлежит определенному человеку, группе или компании, и каждый Cache
можно изменить одним из четырех способов: их можно создавать, удалять, удалять или вставлять. В то время как Cache
изменяется, я хочу заблокировать доступ к нему. каждый Cache
идентифицируется с помощью CacheLocation
Объект, который хранит каталог и имя файла, а также полный путь для удобства.
В настоящее время я использую список массивов внутри класса с именем RequestQueue
который держит ток CacheLocation
объекты обрабатываются. Затем, когда приходит другой поток, он проверяет очередь, чтобы увидеть, CacheLocation
это запрос уже используется. Если это так, то цикл while используется для проверки CacheLocation
периодически, пока запрос, который помещает это там, удаляет это.
Я думал, что это может быть идея иметь HashMap CacheLocation
ключи от BlockingQueue
ценности. Это привело бы к большому набору BlockingQueue
объекты, но я мог управлять очередью довольно хорошо.
Есть ли лучший способ сделать такую точную блокировку зерна?
2 ответа
Если я правильно понимаю ваше описание, один из способов сделать ваш дизайн довольно простым - это:
- использовать
ConcurrentHashMap<CacheLocation, Cache>
хранить тайники (полагаюCacheLocation
s неизменны или, по крайней мере, никогда не видоизменены) - убедитесь, что вы защищаете все доступы к вашему кешу с блокировкой
CacheLocation
объект
Существует также другой неблокирующий (но потенциально более медленный) подход:
map.compute(someId, (key, value) -> {
// atomic access to cache
return null;
});
Прочитайте здесь мой связанный вопрос и ответ