有关同步的两个问题
同步对象应该与wait方法的对象相同吗?我可以这样做:
synchronized (o) {
try {
this.wait();
} catch (InterruptedException e) {
}
}
答案 0 :(得分:1)
如果当前线程在调用其timer()
或void timer(int) {
glutPostRedisplay();
glutTimerFunc(1000/60, timer, 0);
}
方法之前无法IllegalThreadStateException
对象,则抛出synchronize
。所以,不,它没用。
是的,为了重申上述内容,线程必须wait()
在其调用notify()
或synchronize
的同一实例上。因此,该示例仅适用于wait()
。
自引入notify()
以来,我没有找到使用o == this
和wait()
的充分理由,而notify()
现在也不太有用。我建议将该软件包中的高级工具提供给初学者(更易于使用)和高级(更强大和更正确)的程序员。
答案 1 :(得分:1)
<强> 1 强>
您无法在wait()
块之外调用notify()/notifyAll()
或synchronized
,这些块会在方法调用所属的对象上进行同步。如果您尝试,则会获得IllegalMonitorStateException
。
<强> 2 强>
您必需要在wait()/notify()/notifyAll()
调用所属的同一对象上进行同步。例如,您的代码将按编写方式抛出IMSE。您希望改为呼叫synchronized(this){ ...
。