FIL*_*IaS 2 java concurrency constructor wait
我们可以在构造函数上使用wait()方法吗?我有一个构造函数方法,其中我调用一些其他初始化方法和gui方法之后.但它接缝是它在第一种方法之前加载gui.因此它会给尚未初始化的对象带来错误.我尝试在gui的调用之前使用wait()但是有一个IllegalMonitorStateException错误,因为它不在同步块中.
试着这样做:
dice = new Dice();
this.generateBoard();
this.generateCells();
this.wait(200,100); //otherwise??
//GUI
board = new GUI(this);
Run Code Online (Sandbox Code Playgroud)
如你所说,你应该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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,声明构造函数private以确保创建新实例的唯一方法是通过createAndPublish():
MyClass newInstance = MyClass.createAndPublish();
Run Code Online (Sandbox Code Playgroud)