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

标签 java multithreading concurrency

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

例子

 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,这样this 变量就不会阻止 User 对象消失。

你能让 User 对象“现在”消失吗?好吧,答案很复杂,归结为:

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

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

Is there anyway to find out number of threads are using the object currently ?

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

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

关于java - 无论如何要找出当前正在使用该对象的线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14542486/

相关文章:

java - ExecutorService 永远不会停止,没有异常

java - 棘手的 try-catch java 代码

java - 将用户输入与文本文件中的字符串进行比较

java - 如何在选择同一 div 中存在的下拉列表时在 div 末尾附加动态生成的 HTML 表格?

windows - windows线程溢出时如何查看当前栈大小

java - 如何知道线程何时停止或被停止?

c# - 锁定传递的对象会发生什么?

java - 音频文件未出现在播放音乐应用程序中

ruby - 多线程归并排序

swift - 为什么在 Playground 中运行时调度的 print() 的顺序会改变?