Происходит ли это до того, как правило порядка программы работает в конструкторах?

Действительно ли возможно просмотреть частично построенный объект в потоке, созданном в конструкторе, из-за отсутствия синхронизации и утечки этого экземпляра?

За исключением случая, когда есть дочерний класс, конечно, или мы делаем неявное построение с помощью 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
    }
}

P.S. очевидно, что в поле data здесь отсутствует инкапсуляция, однако этот вопрос касается видимости состояния объекта из потока t.


person Boris Treukhov    schedule 27.11.2013    source источник
comment
На практике все должно быть в порядке, теоретически вызов this.data в методе запуска потока не определен, поскольку this может быть еще не инициализирован.   -  person assylias    schedule 28.11.2013
comment
Ваш пример кода ссылается на сноски. Где они?   -  person meriton    schedule 28.11.2013
comment
Сноски на самом деле находятся в вопросе, который я имею в виду. stackoverflow.com/questions/11834173/why-shouldnt-i-use-thread-start-in-the-constructor-of-my-class   -  person Boris Treukhov    schedule 28.11.2013


Ответы (1)


Да. Спецификация явно пишет:

Действие, которое запускает поток, синхронизируется с первым действием в потоке, которое оно запускает.

Конечно, не гарантируется, что объект будет полностью инициализирован после завершения конструктора, потому что конструкторы могут вызывать другие конструкторы либо через оператор явного вызова конструктора или потому, что неявно вызывается конструктор по умолчанию суперкласса. Поэтому утечка this из конструктора довольно ненадежна — с одним или несколькими потоками.

person meriton    schedule 28.11.2013