基本上,我想找出当前有多少线程正在使用该对象。
如果没有人使用该对象引用,那么我想销毁该对象。
例子
User u = new User();
(here I have other code)
if (u is not used by any thread) {
u = null;
}
最佳答案
该问题基于对Java内存管理的基本误解。
将null
分配给变量不会使破坏先前引用的对象,而不会破坏该对象。它实际上所做的是断开可能使它“可到达”的对象的许多路径(从 Activity 变量引用的链)中的一条。如果没有更多路径,则程序中的任何对象都无法访问(使用)该对象,并且可以对其进行垃圾回收。它何时真正消失取决于JVM/垃圾收集器。
当没有其他引用时,您正在尝试使User
对象“消失”。但这还是会发生的。您真正需要做的就是无条件地将null
分配给u
,以便此变量不会阻止User对象消失。
您可以让User
对象“现在”消失吗?答案很复杂,归结为:
并在问题标题中回答问题。
不。不是您的意思。 JVM甚至没有提供一种方法来找出对象引用的实时副本。 JVM提供的最接近的是
SoftReference
和WeakReference
类,可用于检测对象不再具有对该对象的任何常规(强)引用。但这对于解决您的“问题”不是必需的。