在程序命令规则在构造函数中工作之前发生了吗?

Bor*_*hov 7 java concurrency multithreading jls

是否真的可以在构造函数中创建的线程中查看部分构造的对象,因为缺少同步和泄漏此实例?

当然,除了有子类的情况,或者我们正在使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

PS显然数据字段在这里缺乏封装,但是这个问题是关于对象从线程t的状态可见性.

mer*_*ike 3

是的,它确实。规范明确写道

启动线程的操作与其启动的线程中的第一个操作同步。

当然,当构造函数完成时,不能保证对象被完全初始化,因为构造函数可以调用其他构造函数 - 或者通过显式构造函数调用语句,或者因为隐式调用超类默认构造函数。因此,this构造函数的泄漏相当脆弱——无论是单线程还是多线程。