gpt4 book ai didi

java - 使用 Java 的 ReferenceQueue

转载 作者:IT老高 更新时间:2023-10-28 20:32:51 24 4
gpt4 key购买 nike

SoftReferenceWeakReference 真的只有在创建为实例变量时才有帮助吗?在方法范围内使用它们有什么好处吗?

另一大部分是ReferenceQueue。除了能够跟踪哪些引用被确定为垃圾之外,Reference.enqueue()可以用来强制注册一个对象进行垃圾回收吗?

例如,是否值得创建一个方法来占用对象中的一些大量内存资源(由强引用持有)并创建引用以将它们排入队列?

Object bigObject;
public void dispose() {
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
WeakReference<Object> ref = new WeakReference<Object>(bigObject, queue);
bigObject = null;
ref.enqueue();
}

(想象一下,在这种情况下,Object 表示一个使用大量内存的对象类型……比如 BufferedImage 之类的)

这有什么实际效果吗?或者这只是浪费代码?

最佳答案

引用队列的一个常见习语是,例如子类 WeakReference 以附加清理事物所需的信息,然后轮询 ReferenceQueue 以获取清理任务。

ReferenceQueue<Foo> fooQueue = new ReferenceQueue<Foo>();

class ReferenceWithCleanup extends WeakReference<Foo> {
Bar bar;
ReferenceWithCleanup(Foo foo, Bar bar) {
super(foo, fooQueue);
this.bar = bar;
}
public void cleanUp() {
bar.cleanUp();
}
}

public Thread cleanupThread = new Thread() {
public void run() {
while(true) {
ReferenceWithCleanup ref = (ReferenceWithCleanup)fooQueue.remove();
ref.cleanUp();
}
}
}

public void doStuff() {
cleanupThread.start();
Foo foo = new Foo();
Bar bar = new Bar();
ReferenceWithCleanup ref = new ReferenceWithCleanup(foo, bar);
... // From now on, once you release all non-weak references to foo,
// then at some indeterminate point in the future, bar.cleanUp() will
// be run. You can force it by calling ref.enqueue().
}

例如,选择weakKeys时Guava的CacheBuilder实现的内部uses这种方法。

关于java - 使用 Java 的 ReferenceQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14450538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com