在程序订单规则在构造函数中工作之前是否发生?
是否真的有可能在构造函数中创建的线程中查看部分构造的对象,因为缺少同步和泄漏此实例?
除了有子类的情况,当然,或者我们正在用clone或类似的方式进行隐式构造 - 所以我们假设类是final的,并且在调用其他线程之前在调用构造函数的线程中完全初始化。
据我了解,以下hb()规则适用,
线程中的每个动作都发生在该线程的每个动作之前,该动作稍后按程序顺序(程序顺序规则)
线程上的start()调用发生在已启动线程的任何操作之前。
如果hb(x,y)和hb(y,z),则hb(x,z)
那么这是否意味着下面的代码在技术上是线程安全的(我从类似的问题中得到了答案)为什么我不应该在我的类的构造函数中使用Thread.start()呢?还有一个类似的问题为什么它不好练习在构造函数上创建一个新的线程,ps我希望这个不会被重复)
final class SomeClass
{
public ImportantData data = null;
public Thread t = null;
public SomeClass(ImportantData d)
{
t = new MyOperationThread();
// t.start(); // Footnote 1
data = d;
t.start(); // Footnote 2
}
}
PS显然数据字段在这里缺少封装,但是这个问题是关于线程t对象的状态可见性。
是的,它确实。 该规范明确写道:
启动线程的操作与其启动的线程中的第一个操作同步。
当然,一个对象不能保证在构造函数完成时被完全初始化,因为构造函数可以调用其他构造函数 - 通过显式构造函数调用语句,或者因为超类默认构造函数被隐式调用。 因此,从构造函数泄漏this
信息相当脆弱 - 只有一个或多个线程。
上一篇: Does happens before Program order rule work in constructors?