当前位置: 首页 > 面试题库 >

使用ReferenceQueue和WeakReference

强化
2023-03-14
问题内容

我想在其他线程不再引用它时正确关闭Closeable对象。

我写了一些小测试,但是将对象加入队列后,get方法返回null,即poll方法返回没有引用的正确Object。

  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();
  }

提前致谢。任何帮助将不胜感激。


问题答案:

首先,如果仅是关闭,请使用PhantomReference。接下来,从参考队列中,poll()不保证您将获得参考。并且您将永远不会找回实际的对象(参考对象)。

如果要确保Closeable已关闭,则必须自己跟踪它们Map<Reference<?>, Closeable>。然后,当poll()您使用参考队列时,最终将获得,ref然后必须使用它来Closeable从地图获取。

   class MyThing {
      Closeable c;
   }

   Map<Reference<MyThing>, Closeable> m = new HashMap();
   ReferenceQueue<MyThing> reaped = new ReferenceQueue<MyThing>();

   MyThing mt = new MyThing();
   mt.c = new MyClosable();

   Reference<MyThing> pref = new PhantomReference<MyThing>(mt, reaped);
   m.put(pref, mt.c);

   mt = null;


   System.gc();
   Reference<MyThing> rf = reaped.poll();
   while (rf != null) {
     m.get(rf).close(); 
     rf = reaped.poll();
   }

注意 如果您没有真正的理由执行此操作,或者您不了解自己的实际操作,请不要执行此类操作。

您可以关闭您的文件中finally,并顺便说一句,如果它是关于文件,插座等,他们关闭了你(他们已经实现了finalize()



 类似资料:
  • 问题内容: 做和何时为实例变量创建真的只有帮助?在方法范围内使用它们有什么好处? 另一个重要部分是。除了能够跟踪确定垃圾的引用之外,还可以用于强制注册对象以进行垃圾回收吗? 例如,是否值得创建一个方法,该方法在对象中占用一些沉重的内存资源(由强引用保存),并创建引用以将它们排入队列? (想象一下,在这种情况下,Object代表使用大量内存的对象类型…诸如此类) 这有现实效果吗?还是这只是浪费代码?

  • 问题内容: 我试图了解课堂 它是的可选构造函数参数 和 这也是的强制性参数。 根据我已阅读的信息,我可以写一些论文 a)对于PhantomReference方法,get始终返回null b) 对于Phantom引用: 1. gc检测到可以从内存中删除 该对象2. 当我们从队列中调用clear或link到引用的引用时,引用了放置到ReferenceQueue的对象,因为无法访问并且gc看到了3. f

  • 我正在学习Spring Boot,并试图实现身份验证。我有一个注册页面,它使用POST方法发送新用户数据以存储在内存数据库中。奇怪的是,当我提交表单时,GET方法是唯一被调用的方法。这是我的超文本标记语言文件: 如您所见,表单上有< code>method="POST"属性。 这是我的注册控制器: 我已经将放在@GetMap()方法中,即使我点击注册表单上的提交按钮,也可以在我的服务器上看到该方法

  • 问题内容: 我目前正在研究Mockito框架,并且已经使用Mockito创建了一些测试用例。但后来我读到的不是调用模拟( SomeClass的 的.class)我可以使用和-我需要做的唯一一件事情就是我的注释测试类或使用的方法。 但这不起作用-似乎不会起作用!这是我的2个代码修订-一个使用注释,另一个不使用注释。 我究竟做错了什么? 正如我所说-这项工作很棒。但是以下内容不会: 这是课程: 我想念

  • 问题内容: 我对Python相对较新(我使用MATLAB的次数更多)。我本质上希望能够制作和保存动画。因此,我去检查了它的工作方式,发现了这一点:http : //jakevdp.github.io/blog/2012/08/18/matplotlib- animation-tutorial/ 我直接将代码复制/粘贴到IPython Notebook中。 我了解必须安装ffmpeg,我认为我已经安

  • 我已经在运行El Capitan的Mac上安装了Python 2.7和3.5。此外,我在python中使用了Symphy包(与pip一起安装)。我想用Pypy(用自制软件安装)运行我的代码,但Pypy似乎找不到Sympy,并说: “没有名为sympy的模块” 我根本不是专家,现在不知道该怎么办。Sympy可以很好地与Python2和3配合使用,但不能与Pypy配合使用。 我感谢你的每一个回答,提前