线程等待方法需要同步为什么?

时间:2012-12-05 21:02:48

标签: java multithreading

  

可能重复:
  Why wait should always be in synchronized block

我注意到,需要在同步代码块或synchronized方法中调用Thread wait()方法。没有它,它正在抛出

  

java.lang.IllegalMonitorStateException

。为什么呢?

3 个答案:

答案 0 :(得分:0)

请参阅Object.wait的javadoc。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()

“当前线程必须拥有此对象的监视器。该线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后等待,直到它可以重新获得监视器的所有权并恢复执行。“

答案 1 :(得分:0)

来自The Java Tutorials

public synchronized guardedJoy() {
// This guard only loops once for each special event, which may not
// be the event we're waiting for.
while(!joy) {
    try {
        wait();
    } catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}
  

为什么这个版本的guardedJoy会同步?假设d是我们用来调用wait的对象。当一个线程调用d.wait时,它必须拥有d的内部锁 - 否则抛出错误。在synchronized方法中调用wait是获取内部锁的一种简单方法。

您遇到的错误是他们在示例中引用的错误。

答案 2 :(得分:0)

@synchronized(Obj){...}就像: SynchronizedObject.lock()... SynchronizedObject.Unlock()

等待基本简称: SynchronizedObject.Unlock()& SynchronizedObject.Lock()

使IMO更清晰......你需要锁才能释放它