1

基本上我想找出当前有多少线程正在使用该对象。如果没有人使用这个对象引用,那么我想销毁这个对象。

例子

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

1 回答 1

6

这个问题是基于对 Java 内存管理的基本误解

分配null给变量不会破坏它之前引用的对象。它实际上所做的是打破可能的许多路径之一(来自实时变量的引用链)到使其“可访问”的对象。当不再存在路径时,程序中的任何东西都无法到达(使用)该对象,并且有资格进行垃圾收集。它何时真正消失由 JVM / 垃圾收集器决定。

User当没有其他参考时,您正试图使对象“消失”。但这无论如何都会发生。您真正需要做的就是无条件地分配null给,u这样这个变量就不会阻止用户对象消失。

你能让User物体“现在”消失吗?答案很复杂,归结为:

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

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

无论如何要找出当前正在使用该对象的线程数?

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

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

于 2013-01-27T00:35:51.687 回答