为什么要通过"这个" to Thread构造函数不安全?

时间:2014-04-11 20:44:17

标签: java multithreading thread-safety

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

class NewThread implements Runnable {
    Thread t;
    NewThread(){ 
        t = new Thread(this,"My new Thread");
    }
}

1 个答案:

答案 0 :(得分: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());
   }
}

一般来说,从构造函数中“泄漏”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();