Как вы заметили, вы должны звонить wait()
в пределах synchronized
блока. А синхронизация по умолчанию означает, что вы блокируете this
, таким образом, фактически публикуя объект до того, как он полностью сконструирован - идея очень плохая .
Но - как указал @Jon - даже если вы явно заблокировали объект, отличный от this
, вам все равно нужно было преждевременно опубликовать this
в другом потоке, чтобы wait()
имел какой-либо смысл (в противном случае кто мог когда-нибудь notify()
это?). Так что эта схема пахнет.
Лучшей альтернативой было бы использование статического метода фабрики для полного конструирования объекта, затем , чтобы опубликовать его безопасно:
class MyClass {
private MyClass() {
...
}
public static MyClass createAndPublish() {
MyClass theInstance = new MyClass();
// here you can already synchronize on theInstance, call wait() etc.
return theInstance;
}
}
Обратите внимание, что конструктор объявлен private
, чтобы гарантировать, что единственный способ создания новых экземпляров - через createAndPublish()
:
MyClass newInstance = MyClass.createAndPublish();