重新插入番石榴清除过滤器的条目是否安全?
我有一个番石榴(或者更确切地说,我正在从 迁移到 ),这些值表示长时间运行的作业。我想向缓存中添加行为,因为这是清理它的最佳方法;但是,即使一段时间没有通过缓存访问作业,作业可能仍在运行,在这种情况下,我需要防止将其从缓存中删除。我有三个问题:Cache
MapMaker
Cache
expireAfterAccess
重新插入在回调期间被删除的缓存条目是否安全?
RemovalListener
如果是这样,它是否是线程安全的,以至于当回调仍在另一个线程中发生时,就不可能为该键生成第二个值?
CacheLoader
RemovalListener
有没有更好的方法来实现我想要的?这不是严格/只是一个“缓存” - 为每个键使用一个且只有一个值至关重要 - 但我也想在它所代表的作业完成后将条目缓存一段时间。我以前使用过,我需要的行为现在在该类中被弃用。在作业运行时定期 ping 地图是不优雅的,在我的情况下,也是不可行的。也许正确的解决方案是有两个地图,一个没有驱逐,另一个有,并在完成时迁移它们。
MapMaker
我也会提出一个功能请求 - 这将解决问题:允许锁定单个条目以防止驱逐(然后随后解锁)。
[编辑以添加一些详细信息]:此映射中的键是指数据文件。这些值可以是正在运行的写入作业、已完成的写入作业,或者(如果没有作业正在运行)具有从文件中读取的信息的只读查找时生成的对象。重要的是,每个文件正好有零个或一个条目。我可以对这两件事使用单独的地图,但必须在每个密钥的基础上进行协调,以确保一次只存在一个或另一个。使用单个映射可以使其更简单,从而获得正确的并发性。