В соответствии с спецификацией языка Java конструкторы не могут быть помечены как синхронизированные, потому что другие потоки не могут видеть создаваемый объект до тех пор, пока поток, создающий его, не будет завершен Это. Это кажется немного странным, потому что у меня действительно может быть другой поток, рассматривающий объект во время его построения:
public class Test {
public Test() {
final Test me = this;
new Thread() {
@Override
public void run() {
// ... Reference 'me,' the object being constructed
}
}.start();
}
}
Я знаю, что это довольно надуманный пример, но теоретически представляется, что кто-то может придумать более реалистичный случай, когда маркировка синхронизированного конструктора будет законна, чтобы предотвратить гонки с потоками, подобными этой.
Мой вопрос заключается в следующем: есть ли причина, по которой Java специально запрещает синхронизированный модификатор в конструкторе? Возможно, мой вышеприведенный пример ошибочен, или, возможно, нет причин и это произвольное дизайнерское решение. В любом случае мне действительно любопытно и хотелось бы узнать ответ.