Java: точная блокировка зерна для запросов?

Я пытаюсь создать механизм точной блокировки зерна для следующего сценария:

У меня есть хранилище данных со многими сериализованными Cache объекты внутри него. каждый Cache принадлежит определенному человеку, группе или компании, и каждый Cache можно изменить одним из четырех способов: их можно создавать, удалять, удалять или вставлять. В то время как Cache изменяется, я хочу заблокировать доступ к нему. каждый Cache идентифицируется с помощью CacheLocation Объект, который хранит каталог и имя файла, а также полный путь для удобства.

В настоящее время я использую список массивов внутри класса с именем RequestQueue который держит ток CacheLocation объекты обрабатываются. Затем, когда приходит другой поток, он проверяет очередь, чтобы увидеть, CacheLocation это запрос уже используется. Если это так, то цикл while используется для проверки CacheLocation периодически, пока запрос, который помещает это там, удаляет это.

Я думал, что это может быть идея иметь HashMap CacheLocation ключи от BlockingQueue ценности. Это привело бы к большому набору BlockingQueue объекты, но я мог управлять очередью довольно хорошо.

Есть ли лучший способ сделать такую ​​точную блокировку зерна?

2 ответа

Решение

Если я правильно понимаю ваше описание, один из способов сделать ваш дизайн довольно простым - это:

  • использовать ConcurrentHashMap<CacheLocation, Cache> хранить тайники (полагаю CacheLocations неизменны или, по крайней мере, никогда не видоизменены)
  • убедитесь, что вы защищаете все доступы к вашему кешу с блокировкой CacheLocation объект

Существует также другой неблокирующий (но потенциально более медленный) подход:

map.compute(someId, (key, value) -> {
  // atomic access to cache
  return null;
});

Прочитайте здесь мой связанный вопрос и ответ

Другие вопросы по тегам