反正有没有找出当前正在使用该对象的线程数?

时间:2013-01-26 23:03:48

标签: java multithreading concurrency

基本上我想知道目前有多少线程正在使用该对象。 如果没有人使用此对象引用,那么我想销毁此对象。

示例

 User u = new User();
 (here I have other code) 
 if (u is not used by any thread) {
   u = null;
 }

1 个答案:

答案 0 :(得分:6)

此问题基于Java内存管理的基本误解

将<{1}}分配给变量 NOT 会销毁之前引用的对象。 实际上所做的是将可能的许多路径(从实时变量的引用链)中断一个到使其“可达”的对象。当不再存在路径时,程序中的任何内容都无法访问(使用)该对象,并且符合条件的将被垃圾回收。当它实际消失时,由JVM /垃圾收集器自行决定。

当其他任何内容都没有引用时,你试图使null对象“消失”。但无论如何,这种情况还是会发生的。您真正需要做的就是无条件地将User分配给null,以便变量不会阻止User对象消失。

你能让u对象现在消失吗?答案很复杂,归结为:

  • 你不能可靠地做到这一点,
  • 你不能有效地做到这一点。

并回答问题标题中的问题。

  

有没有找到当前正在使用该对象的线程数?

没有。不是你的意思。 JVM甚至没有提供一种方法来找出Object的引用有多少活动副本。 JVM最接近提供此类的是UserSoftReference类,可用于检测对象不再具有对它的任何正常(强)引用。

但这不是解决你的“问题”所必需的。