如果在同步块中使用wait和notify方法会发生什么?它有用吗?

时间:2015-06-25 19:30:55

标签: java synchronization

有关同步的两个问题

  1. 如果在非同步块中使用wait和notify方法会发生什么?它有用吗?
  2. 同步对象应该与wait方法的对象相同吗?我可以这样做:

    synchronized (o) {
        try {
            this.wait();
        } catch (InterruptedException e) {
    
        }
    }
    

2 个答案:

答案 0 :(得分:1)

  1. 如果当前线程在调用其timer()void timer(int) { glutPostRedisplay(); glutTimerFunc(1000/60, timer, 0); } 方法之前无法IllegalThreadStateException对象,则抛出synchronize。所以,不,它没用。

  2. 是的,为了重申上述内容,线程必须wait()在其调用notify()synchronize的同一实例上。因此,该示例仅适用于wait()

  3. 自引入notify()以来,我没有找到使用o == thiswait()的充分理由,而notify()现在也不太有用。我建议将该软件包中的高级工具提供给初学者(更易于使用)和高级(更强大和更正确)的程序员。

答案 1 :(得分:1)

<强> 1 您无法在wait()块之外调用notify()/notifyAll()synchronized,这些块会在方法调用所属的对象上进行同步。如果您尝试,则会获得IllegalMonitorStateException

<强> 2 必需要在wait()/notify()/notifyAll()调用所属的同一对象上进行同步。例如,您的代码将按编写方式抛出IMSE。您希望改为呼叫synchronized(this){ ...