【发布时间】:2009-05-11 21:26:11
【问题描述】:
鉴于 J5+ 内存模型 (JSR-133),以下代码是线程安全且允许的吗?
如果它是安全的,在某些情况下是否可以接受?
public final class BackgroundProcessor
extends Object
implements Runnable
{
public BackgroundProcessor(...) {
super();
...
new Thread(this).start();
}
public void run() {
...
}
}
当我阅读新的 JMM 规范时,启动线程会创建与启动线程所做的任何事情的发生前关系。
假设对象在构造函数中设置了私有成员变量并在run()中使用。
并且该类被标记为 final 以防止子类意外。
注意:这里有一个类似的问题,但角度不同:calling thread.start() within its own constructor
【问题讨论】:
-
我建议除了初始化字段之外,在构造函数中做任何事情都不是一个好主意。这将使您的代码很难测试。这是一篇有用的文章,比我能更好地解释这一点:misko.hevery.com/code-reviewers-guide。我最初把它作为一个答案,但它实际上并没有回答你的问题,因此它是一个评论。
-
@bm212:很好的参考(+1)。虽然,这是一个特例构造,我试图确定是否需要重构,以及在什么优先级。
标签: java multithreading