Java:寻找可变/可重新引用的弱引用实现

时间:2011-02-13 21:53:01

标签: java implementation mutable weak-references

我正在寻找类似于java.lang.ref.WeakReference的弱引用实现,但它提供了set()方法或其他一些重新引用创建的弱引用对象的方法。这是一个例子:

MutableWeakReference ref = new MutableWeakReference(someObject);
ref.set(anotherObject);

我需要这样做以避免对象创建,在我的情况下,执行时间会减慢一个数量级,因为我不断更改弱引用引用的对象。

我尝试从JDK复制代码,但似乎不可能,因为java.lang.ref.Reference使用内部的sun.misc.Cleaner类。我也看了Android的实现,但它似乎依赖于Dalvik VM的垃圾收集。我想知道这是否可以在不改变JVM /环境的情况下实现。

3 个答案:

答案 0 :(得分:3)

是不是可以将您的引用封装在一个简单的

class MyOwnReference<T> {
    public T ref;
    public void set(T o) { ref = o; }
}

并创建WeakReference<MyOwnReference<WhatEver>>

  

我想知道这是否真的可以在不改变JVM /环境的情况下实现。

不,你可能无法“重新实现”WeakReference。它是JVM支持的类。

您确定WeakReference个实例的创建会降低它的速度吗?我不认为这样做

ref = new WeakReference(someObject);

而不是一些

ref.set(anotherObject);

会贵得多。

答案 1 :(得分:3)

  

我实际上正在实现某种迭代器。每当我前进到下一个条目时,我都需要创建一个新的WeakReference

我很困惑为什么你需要在迭代器中使用WeakReferenceWeakReference的正常用例是对对象的长期引用。但迭代器通常是一个短期对象,迭代通常是一个短期过程。它/他们在短期内使用普通(强)引用目标对象的事实不应该是一个问题。

  

我已经进行了一些测试,看起来好像是慢了8-10倍。

同样,这表明您根本不应该使用WeakReference

为什么常规参考不适合您,是否有特殊原因?

答案 2 :(得分:0)

您无法自行编写弱引用。它是JVM专门处理的“特殊”类。

只需使用新的弱引用

class MutableWeakReference<T> 

    WeakReference<T> wr;

    void set(T obj)
        wr = new WeakReference(obj);