我正在寻找一个带有过期功能的并发Set用于Java 1.5应用程序。它将被用作存储/缓存名称(即String值),在一定时间后会过期。
我要解决的问题是,两个线程不应该能够在某段时间内使用相同的名称值(因此这类似于黑名单,确保同一“名称”,它类似于消息引用,直到经过一定的时间段,另一个线程才能重新使用)。我无法控制名称生成本身,因此不能对实际名称/字符串进行强制唯一性的限制,而应该将其视为限制机制,以防止同一名称每秒钟被多次使用。
例如:线程#1执行
容器将在某些时候处理50-100次插入/读取操作。
我已经仔细研究了不同的解决方案,但没有找到符合我的需求的东西。这似乎是一个简单的问题,但我发现所有的解决方案都过于复杂或过度设计。
一个简单的想法是使用
我要解决的问题是,两个线程不应该能够在某段时间内使用相同的名称值(因此这类似于黑名单,确保同一“名称”,它类似于消息引用,直到经过一定的时间段,另一个线程才能重新使用)。我无法控制名称生成本身,因此不能对实际名称/字符串进行强制唯一性的限制,而应该将其视为限制机制,以防止同一名称每秒钟被多次使用。
例如:线程#1执行
cache.add("unique_string, 1)
,它将名称“unique_string”存储1秒钟。如果任何线程在1秒钟内通过cache.get("unique_string")
查找“unique_string”,它将得到一个肯定的响应(项目存在),但之后该项目应该过期并从集合中删除。容器将在某些时候处理50-100次插入/读取操作。
我已经仔细研究了不同的解决方案,但没有找到符合我的需求的东西。这似乎是一个简单的问题,但我发现所有的解决方案都过于复杂或过度设计。
一个简单的想法是使用
ConcurrentHashMap
对象,其键设置为“名称”,值设置为过期时间,然后运行每秒钟的线程并删除所有过期时间(即值)已经过去的元素,但我不确定这样做的效率如何?是否有我错过的更简单的解决方案?