为什么将"this"传递给Thread构造函数是不安全的?

Hel*_*rld 0 java multithreading thread-safety

为什么将"this"传递给Thread构造函数是一种不安全的构造技术?如果是那么替代方案是什么?它与测试或调试有关吗?我找到了一些答案,但没有完全理解.

class NewThread implements Runnable {
    Thread t;
    NewThread(){ 
        t = new Thread(this,"My new Thread");
    }
}
Run Code Online (Sandbox Code Playgroud)

Rus*_*ser 5

传递this给线程构造函数没有错.我怀疑你所指的是在你自己的构造函数中传递this给一个线程构造函数.

class MyClass implements Runnable {
   private final Integer value;

   MyClass() {
      new Thread(this);
      int i = 0;
      value = Integer.valueOf(20 / i);
   }

   @Override
   public void run() {
      System.out.println(value.intValue());
   }
}
Run Code Online (Sandbox Code Playgroud)

通常,this从构造函数中"泄漏" 引用是一个坏主意,因为如果构造函数抛出异常,则对象可能会处于不一致状态.

更具体地说,this在构造函数中启动一个线程是个坏主意,因为线程可能在构建完对象之前开始运行.因此,即使i是上面的1,run()也可能仍然会因为它可能在value分配之前发生.

在某些情况下,您可以通过在构造函数的最后一行创建线程来解决这个问题.但这并非万无一失,因为该构造函数可能被超类调用.更好的解决方案是:

class MyClass implements Runnable {
    ...
    MyClass start() {
        new Thread(this);
        return this;
    }
    ...
}

// Then construct like this:
MyClass foo = new MyClass().start();
Run Code Online (Sandbox Code Playgroud)