Безопасно ли повторно вставлять запись из Guava RemovalListener?

У меня есть Guava Cache (точнее, я перехожу с MapMaker до Кэш ), а значения представляют долго выполняемые задания. Я хотел бы добавить в кеш поведение expireAfterAccess , так как это лучший способ его очистить; однако задание может все еще выполняться, даже если к нему не обращались через кеш в течение некоторого времени, и в этом случае мне нужно предотвратить его удаление из кеша. У меня три вопроса:

  1. Безопасно ли повторно вставлять запись в кеш, которая удаляется во время обратного вызова RemovalListener ?

  2. Если да, то является ли это потокобезопасным, так что нет возможности CacheLoader может выдать второе значение для этого ключа, в то время как обратный вызов RemovalListener все еще выполняется в другом потоке?

  3. Есть ли лучший способ достичь того, что я хочу? Это не строго / только «кеш» - очень важно, чтобы для каждого ключа использовалось одно и только одно значение, но я также хочу кэшировать запись в течение некоторого времени после завершения задания, которое она представляет. Раньше я использовал MapMaker , и необходимые мне варианты поведения теперь не рекомендуются в этом классе. Регулярно проверять карту во время выполнения заданий - это неэлегантно, а в моем случае - невозможно.Возможно, правильное решение - иметь две карты, одну без выселения, а другую с, и переносить их по мере завершения.

Я также сделаю запрос функции - это решит проблему: разрешить блокировку отдельных записей, чтобы предотвратить выселение (а затем впоследствии разблокировать).

[Отредактируйте, чтобы добавить некоторые детали]: Ключи на этой карте относятся к файлам данных. Значения представляют собой либо текущее задание записи, либо завершенное задание записи, либо - если задание не запущено - объект только для чтения, созданный при поиске с информацией, считанной из файла. Важно, чтобы для каждого файла было ровно ноль или одна запись. Я мог бы использовать отдельные карты для этих двух вещей, но должна была бы быть координация для каждого ключа, чтобы гарантировать, что только один или другой существует одновременно. Использование одной карты упрощает задачу обеспечения правильного параллелизма.

13
задан David Noha 19 January 2012 в 02:00
поделиться