微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

理解弱引用

如何解决理解弱引用

在下面的代码中...

public class MyObject {
    public static Map<String,WeakReference<MyObject>> cache = new HashMap<>();
    public static ReferenceQueue<MyObject> queue = new ReferenceQueue<>();
    public MyObject(String... args) {
        //define variables...
        cache.put(args[0],new WeakReference<>(this,queue));
    }
    // getters and setters
}

如果连续创建 MyObject,由于 cache 只包含弱引用垃圾收集器最终会从 cache删除项目吗?这些项目会变成null吗?有没有更好的缓存对象的方法?我的目标是存储不和谐消息,这样我就不必再次获取它们。

解决方法

WeakReferences(一旦被理解)就不是魔法,而且经常很容易被误用。一个这样的例子就是你的情况。首先,声明一个 explicit ReferenceQueue<MyObject> 对你来说没什么用,这意味着你想“从这里和那里”推送代码以使其工作;这不是一个好策略。

一周参考的想法并不复杂。一旦 GC 循环发现某个实例被弱引用(存在对其的非强引用),它可以简单地回收该内存并开始从 null 返回 WeakReference::get。以您的示例为例,当某个 MyObject 实例将被弱引用时,您的:

map.get("whatever").get()

将开始返回 null。但 Map.Entry 仍将出现在 HashMap 中。没有自动魔法清理。即使 WeakHashMap 也不是魔法。

有许多“其他”方法可以缓存事物,如果没有更多细节,就很难说,这适合您的情况。有 guava,最近使用的缓存,如 LinkedHashMap 等。

,

垃圾收集器最终会从缓存中删除项目吗?

GC 最终会破坏引用,并将它们排入引用队列。

它不会自动从地图中删除条目(带有损坏的引用)。为此,您需要添加一些东西来使用引用队列并从地图中删除过时的条目。

这些项目会变成空吗?

见上。 (不清楚你的意思……)

有没有更好的缓存对象的方法?

可能,使用 WeakHashMap。它处理删除损坏的引用的问题。但是打破参考的标准是不同的。在这种情况下,当发现 >>key

另一种选择是使用使用 LinkedHashMap 实现的 LRU 缓存。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。