了解引用处理程序线程

2022-09-01 19:24:04

我正在继续深入理解Java Thread的道路。不幸的是,我的Java认证没有涵盖这一部分,所以唯一的学习方法是发布一系列愚蠢的问题。有了这么多年的Java开发经验,我有时想知道我还需要学习多少:-)

特别是我现在的注意力放在引用处理程序线程上。

"Reference Handler" daemon prio=10 tid=0x02da3400 nid=0xb98 in Object.wait() [0x0302f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1aac0320> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x1aac0320> (a java.lang.ref.Reference$Lock)

现在有一些问题接踵而至,对于其中一些,我知道答案,但我没有发布它,因为我想听听别人的意见:

  1. 引用处理程序线程应该做什么?
  2. 线程转储应该被认为是自下而上的,为什么堆栈跟踪从锁定开始,lock语句不应该至少在线程运行后出现吗?
  3. “原生方法”是什么意思?
  4. 为什么是“未知来源”,在这种情况下,线程转储无法调用源代码?
  5. 最后等待和锁定有相同的,为什么?

像往常一样,我恳请回答所有问题,以便我可以标记已回答。


答案 1
  1. 我怀疑它处理JVM的终结器。这是一个实现细节,因此在JVM规范中没有指定。
  2. 这仅意味着 被锁定在其前面的行中提到的方法中(即 在 .java.lang.ref.Reference$LockReferenceHandler.run()
  3. “Native Method”仅仅意味着该方法是在原生(即非Java)代码中实现的(想想JNI)。
  4. “未知来源”仅表示该文件不包含任何源代码位置信息(至少对于此特定点)。当该方法是合成方法(此处看起来不像)或类在没有调试信息的情况下编译时,可能会发生这种情况。.class
  5. 当线程等待某个对象时,它必须在调用跟踪的某个点锁定该对象,因此如果没有相应的 .,您就不能真正拥有 。waiting onlocked

答案 2

1) 终结器线程调用终结器方法。引用线程具有类似的用途。

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/ref/Reference.java.htm

OpenJDK源代码声明它是一个

用于将挂起的引用排入队列的高优先级线程

GC 创建一个需要处理的引用的简单链表,此线程会快速将它们添加到适当的队列中。这是分两个阶段完成的原因是GC除了查找引用之外什么都不做,此线程调用处理这些引用的代码,例如调用清理器,并通知ReferenceQueue侦听器。

2) 在输入同步方法之前,会为其获取锁。

3-5)由约阿希姆;)覆盖