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

时间:2013-11-27 20:29:20

标签: java multithreading concurrency jls

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

当然,除了存在子类的情况,或者我们正在使用克隆或类似的东西进行隐式构造 - 所以让我们假设该类是 final 并且它是完全初始化的在调用其他线程之前调用构造函数的线程中。

据我所知,以下hb()规则适用,

  • 线程中的每个操作都发生在该线程中的每个操作之前 稍后在程序订单(程序订单规则)

  • 中出现
  • 在启动线程中的任何操作之前,对线程的start()调用发生。

  • 如果是hb(x,y)和hb(y,z),那么hb(x, z)

这是否意味着以下代码在技术上是线程安全的(我从类似的问题Why shouldn't I use Thread.start() in the constructor of my class?中得到了它,还有一个类似的问题Why it is bad practice to create a new thread on constructors?,ps我希望 this < / em>一个不会被重复关闭)

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
    }
}

P.S。显然 data 字段在这里缺少封装,但是这个问题是关于对象从线程t的状态可见性。

1 个答案:

答案 0 :(得分:3)

是的,确实如此。规范明确writes

  

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

当然,当构造函数完成时,不保证对象完全初始化,因为构造函数可以通过explicit constructor invocation statement调用其他构造函数,或者因为隐式调用了超类默认构造函数。因此,从构造函数中泄漏this相当脆弱 - 使用单个或多个线程。