java - 具有值(等于)相等性的 SoftReference 的潜在用途

标签 java concurrency guava concurrenthashmap

我之前得出的结论是,如果您需要一个具有基于值(等于)的相等性的 SoftReference,那么设计就会很糟糕,但内部人员除外。这是继 Google Collections 和 Guava 之后,不包括此类。但是我遇到了一个问题,我认为可以使用这样的对象。

我们在视觉效果渲染场中有一个 Assets 管理系统,其中有 100 个进程运行相同的作业,只是渲染的帧数不同。我们有一个 Oracle 数据库,需要记录所有使用的 Assets 。在中间层 Assets 管理系统中,我们可以使用 HashSet 来记录是否要插入到 Oracle 中的对象,而不是用相同的插入来攻击 Oracle,在这种情况下只有一个会成功完成所有作业。

我可以使用带有过期时间的 Google MapMaker,但我不想担心过期时间是否正确,我们的渲染可以在几小时内运行,有些甚至可以在几天内运行。使用 equals 相等性的 SoftReference 听起来是一种更好的方法,因此 JVM 将自动管理垃圾回收。

对于我想用带垃圾收集的 ConcurrentHashMap 解决的其他问题,我会在 HashMap 中使用强引用作为获得 equals() 相等性的键,并使用 SoftReference 作为值,以便 JVM 可以垃圾收集一些东西,但在这种情况下,这个值并不重要,我没有一个值可以包装在 SoftReference 中放在那里。因此,使用带有 equals() 的 SoftReference 似乎可以解决问题。

对此还有其他建议吗?

最佳答案

在大多数情况下,当您想对 Google Collections 使用软引用时,您应该调用

MapMaker.softValues()

对于强键但软值,查找将使用相等性,并且当内存紧张时键值对将被垃圾收集。

关于java - 具有值(等于)相等性的 SoftReference 的潜在用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250191/

相关文章:

java - 使用 Guava 的 future 可迭代?

java - 当我尝试执行请求时出现 IllegalArgumentException

java - 我可以在没有任何java请求的情况下重定向页面吗?

java - 将数据库中的数据添加到表中

database - 软件事务内存是否与数据库事务相同?

java - 是否有类似字节(字节...b):byte[]?的东西

java - 使用 Java 8 流解析字符串

java - 更改方法中变量的值,Java

node.js - 将函数作为单独的 node.js 进程运行?

c# - 任务报告 IsCompleted 但仍然阻止结果?