我对this代码中的代码段感到困惑:

void stopTestThread() {

    // thread should cooperatively shutdown on the next iteration, because field is now null
    Thread testThread = m_logTestThread;
    m_logTestThread = null;
    if (testThread != null) {
      testThread.interrupt();
      try {testThread.join();} catch (InterruptedException e) {}
    }
  }

这是否意味着testThread和m_logTestThread是不同的实例,但指向内存中的同一对象,因此它们是同一线程?

如果是这样,if (testThread != null)的目的是什么?

最佳答案

这是否意味着testThread和m_logTestThread是不同的实例
但指向内存中的同一对象,因此它们是相同的
线?

这是部分正确的。实际上testThreadm_logTestThread是两个不同的references,而不是instances。并且两个引用都指向同一个Thread对象。因此,仅使reference m_logTestThread指向null不会使testThread引用也指向null

您还可以通过一个简单的示例在实践中看到它:-

String str = "abc";
String strCopy = str;  // strCopy now points to "abc"
str = null;  // Nullify the `str` reference

System.out.println(strCopy.length()); // Will print 3, as strCopy still points to "abc"

因此,即使将其中一个引用设置为null,另一个引用仍然指向同一Thread对象。在对象具有指向它的0 reference或存在circular reference之前,该对象不符合垃圾收集的条件。

请参阅以下链接:-Circular Reference - wiki page知道Circular Refeference到底是什么。

“if(testThread!= null)”的目的是什么?

这很简单。您可以从这种情况推断出,它正在检查testThread参考是否指向null对象。
完成null check的目的是,您不会在NPE内获得if-construct,而在该位置尝试中断该引用所指向的线程。因此,如果该引用指向null,则您没有与该引用相关联的任何线程来中断。

07-27 17:42