Действительно ли возможно просмотреть частично построенный объект в потоке, созданном в конструкторе, из-за отсутствия синхронизации и утечки этого экземпляра?
За исключением случая, когда есть дочерний класс, конечно, или мы делаем неявное построение с помощью 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.
this.data
в методе запуска потока не определен, посколькуthis
может быть еще не инициализирован. - person assylias   schedule 28.11.2013