我希望能够在其他线程不再引用可关闭对象时正确关闭它。
我编写了一些小测试,但在对象被入队后,get方法返回null,也就是poll方法返回的正确对象没有引用。
public static void main(String[] args)
{
ReferenceQueue<Closeable> reaped = new ReferenceQueue<Closeable>();
Closeable s = <SOME CLOSEABLE IMPL>;
WeakReference<Closeable> ws = new WeakReference<Closeable>(s, reaped);
s = null;
System.gc();
Closeable ro = (Closeable)reaped.poll().get();
ro.close();
}
提前致谢。 任何帮助都将不胜感激。
System.gc()
之后得到垃圾回收。您不应该将终结器用于业务逻辑,它仅用于特殊目的,如缓存和(最终)防止资源泄漏。您不能在终结器中执行诸如commit()
或rollback()
数据库事务的操作。 - Op De CirkelIndexSearcher
是一个非常重量级的对象,我无法想象这种方法怎么可能是明智的。通常情况下,IndexSearcher
会作为整个应用程序的单例一直存在。现代 Lucene 版本应该使用SearcherManager
或NRTManager
来获得完整的维护周期。 - Marko Topolnik