Ну, если вы не хотите особенно не соглашаться с Брайаном Гетцем по вопросу параллелизма Java, я бы предположил, что это неправильно. Хотя его точные слова "лучше не ...", я все равно прислушаюсь к его совету. От JCIP, стр. 42:
"A распространенная ошибка , которая может позволить
«этот» эталонный побег во время
конструкция должна начать поток
из конструктора [...] Есть
ничего плохого в том, что создает поток
в конструкторе, но лучше не
начать поток немедленно.
Вместо этого выставьте начало или инициализируйте
метод ... "
Обновление: просто для подробного объяснения, почему это проблема. Хотя между вызовом Thread.start () и тем методом run (), который фактически начинает выполняться, гарантированный барьер памяти существует, такого барьера между тем, что происходит во время конструктора после вызова Thread, не существует. .Начните(). Таким образом, если некоторые другие переменные все еще должны быть установлены, или если JVM выполняет некоторую служебную работу «просто-только-построенный-объект», ни одна из них не гарантированно будет замечена другим потоком: то есть объект может быть виден другой поток в неполном состоянии.
Между прочим, помимо того, действительно ли он ломает JMM, он также выглядит как «странная вещь» в конструкторе.