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)
传递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)