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

R H*_*R H 1 java concurrency multithreading

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

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

Ste*_*n C 6

本课题基于对Java内存管理的基本误解.

分配null给一个变量不会摧毁它之前所引用的对象.它实际上做的是将可能的许多路径(从实时变量的引用链)中断一个到使其"可达"的对象.当不再存在路径时,程序中的任何内容都无法访问(使用)该对象,并且有资格进行垃圾回收.当它实际消失时,由JVM /垃圾收集器决定.

User当其他任何东西都没有引用时,你试图让对象"消失".但无论如何,这种情况还是会发生的.您真正需要做的就是无条件地分配null,u以便变量不会阻止User对象消失.

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

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

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

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

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

但这不是解决你的"问题"所必需的.