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

Java:寻找可变/可重引用的弱引用实现,java,implementation,mutable,weak-references,Java,Implementation,Mutable,Weak References,我正在寻找一个类似于java.lang.ref.WeakReference的弱引用实现,但它提供了一个set()方法或一些其他方法来重新引用创建的弱引用对象。以下是一个例子: MutableWeakReference ref = new MutableWeakReference(someObject); ref.set(anotherObject); 我需要这样做来避免对象创建,在我的例子中,对象创建会将执行时间降低一个数量级,因为我不断地更改弱引用所指的对象 我试图从JDK复制代码,但似乎不

我正在寻找一个类似于
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/环境的情况下,这是否真的可以实现。

将引用封装在一个简单的

class MyOwnReference<T> {
    public T ref;
    public void set(T o) { ref = o; }
}
而不是一些

ref.set(anotherObject);
会贵得多


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

我不明白为什么在迭代器中需要使用
WeakReference
WeakReference
的正常使用情形是对对象的长期引用。但迭代器通常是短期对象,而迭代通常是短期过程。事实上,it/他们在短期内对目标对象使用普通(强)引用不应该引起关注

我已经做了一些测试,看起来速度慢了8-10倍

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


有没有什么特别的原因可以解释为什么常规的参考资料对你不起作用?

你不能自己编写弱参考资料。它是JVM专门处理的“特殊”类

只需使用一个新的弱引用

class MutableWeakReference<T> 

    WeakReference<T> wr;

    void set(T obj)
        wr = new WeakReference(obj);  
类可变WeakReference
WeakReference wr;
无效集(T obj)
wr=新的WeakReference(obj);

我实际上是在实现某种迭代器。每当我进入下一个条目时,我都需要创建一个新的WeakReference。我已经运行了一些测试,看起来慢了8-10倍。我认为这个解决方案没有帮助。我刚刚运行了一个简单的基准测试,比较了创建强引用和弱引用。结果强烈支持弱参考文献。这很奇怪,但可重复,很可能是由于GC开销和强大引用占用的不可回收内存造成的巨大开销。如果您经常更改引用,如果一个WeakReference的referent是可变的,那么可能存在一种竞争条件,在它被放入ReferenceQueue之后,您可以对其进行变异。我不认为这是可行的,我想实现一个非失败快速迭代器,一旦它引用的条目被删除,它就会变得无效。WeakReference提供了一种局部安全性,即如果删除了已删除的迭代器条目,则无法“取消引用”该条目(该安全性只是局部的,因为无法保证对象将立即删除)。您几乎可以肯定,它不会立即删除。此外,它还可以从其他地方引用,而不会被删除。我不认为这样的迭代器有什么好处。Fail fast有时很好,无故障(例如,反映集合的某些旧状态)有时很好,对于您的版本,我真的不知道。@leden-我可以想出更好(更便宜、更可靠)的实现方法。。。这取决于您迭代的内容。如果你提供更多关于你正在迭代的数据结构的细节,我可以说得更具体一些。我正在迭代的东西最接近链表。到目前为止,我提出的最好的方法是为每个条目添加一个额外的布尔条目。因此迭代器可以检查条目是否被删除。这是一个轻微的内存开销,如果存在这些可变的弱引用,就会存在这种开销。你有更好的选择吗?
class MutableWeakReference<T> 

    WeakReference<T> wr;

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