何时在Java中使用虚引用?

18

我已经了解了不同类型的引用,了解强引用、软引用和弱引用的工作原理。

但是当我读到幽灵引用时,我并不能真正理解它们。可能是因为我找不到任何好的示例来展示它们的目的或者何时使用它们。

你能否给我展示一些使用幽灵引用的代码示例呢?


或者:https://dev59.com/uHI-5IYBdhLWcg3w8dYQ - Brendan Long
简短回答:除了使用它作为比重写“finalize”更好、更安全的终结方法之外,几乎没有其他应用程序。 - Louis Wasserman
@LouisWasserman,你能给我一个详细的例子吗?我希望看到它。谢谢 :) (只需告诉我如何使用虚引用而不是finalize) - hqt
我正在研究在JOGL项目中使用幽灵引用来自动删除在视频内存中创建的缓冲区、纹理等等。虽然分配视频内存的Java对象可能会被垃圾回收,但它分配的内存不会,必须手动释放。重写对象的finalize()方法是行不通的,因为GL在任何时候都不可用;然而,对对象的幽灵引用可以告诉GL线程在下次运行时释放内存。 - Andy
我用它来追踪内存泄漏。我观察可疑的对象,看它们何时被垃圾回收。这对此非常有帮助。 - MiguelMunoz
1个回答

11

我自己从未尝试过这种做法,因为只有极少数人需要它。但我认为这是一种方法。

abstract class ConnectionReference extends PhantomReference<Connection> {
  abstract void cleanUp();
}
...
ReferenceQueue<Connection> connectionQueue = new ReferenceQueue<>();
...
Connection newConnection = ...
ConnectionReference ref = new ConnectionReference(newConnection, connectionQueue, ...);
...
// draining the queue in some thread somewhere...
Reference<? extends Connection> reference = connectionQueue.poll();
if (reference != null) {
  ((ConnectionReference) reference).cleanUp();
}
...

这与该帖子所建议的大致相似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接