Почему конструкторы Java не могут быть синхронизированы?

Согласно Спецификации языка Java конструкторы не могут быть помечены как синхронизированные, потому что другие потоки не могут видеть создаваемый объект, пока поток, создающий его, не завершит его. Это кажется немного странным, потому что у меня действительно может быть другой поток, просматривающий объект, пока он создается:

public class Test {
    public Test() {
       final Test me = this;
       new Thread() {
           @Override
           public void run() {
               // ... Reference 'me,' the object being constructed
           }
       }.start();
    }
}

Я знаю, что это довольно надуманный пример, но теоретически кажется, что кто-то может придумать более реалистичный случай, когда отметка синхронизируемого конструктора была бы законной для предотвращения гонок с потоками, подобными этому.

Мой вопрос таков: есть ли причина, по которой Java специально запрещает модификатор synchronized в конструкторе? Возможно, мой приведенный выше пример ошибочен, или, возможно, на самом деле нет причин и это произвольное дизайнерское решение. В любом случае, мне действительно любопытно, и я хотел бы узнать ответ.

63
задан GEOCHET 7 August 2015 в 14:22
поделиться