我之前得出的结论是,如果您需要一个基于值(等于)的等式的 SoftReference,那么一个人的设计就很糟糕,除了一个内部人员。这是在 Google Collections 和 Guava 之后,不包括此类。但是我遇到了一个我认为可以使用这样一个对象的问题。
我们在视觉效果渲染农场中有一个资产管理系统,其中有 100 个进程在运行相同的作业,只是渲染的帧数不同。我们有一个 Oracle 数据库,需要记录所有使用的资产。在中间层资产管理系统中,我们可以使用 HashSet 来记录是否将插入 Oracle 的对象,而不是用相同的插入来冲击 Oracle。
我可以使用具有过期时间的 Google MapMaker,但我不想担心过期时间是否正确,我们的渲染可以在数小时内运行,有些则在几天内运行。使用具有等于相等性的 SoftReference 听起来是一种更好的方法,因此 JVM 将自动管理垃圾收集。
对于我想使用带有垃圾收集的 ConcurrentHashMap 解决的其他问题,我将使用 HashMap 中的强引用作为获取 equals() 相等性的关键,并将 SoftReference 作为值,以便 JVM 可以垃圾收集某些东西,但是在这个在这种情况下,值无关紧要,我没有值可以包装在 SoftReference 中以放在那里。因此,似乎使用带有 equals() 的 SoftReference 可以解决问题。
对此有何其他建议?