Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程等待方法需要同步为什么?_Java_Multithreading - Fatal编程技术网

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

Java 线程等待方法需要同步为什么?,java,multithreading,Java,Multithreading,可能重复: 我注意到,threadwait()方法需要在同步代码块或同步方法中调用。没有这一点,它就是投掷 java.lang.IllegalMonitorStateException 。为什么?请参考javadoc中的Object.wait () “当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。”From 为什么这个版本的g

可能重复:

我注意到,threadwait()方法需要在同步代码块或同步方法中调用。没有这一点,它就是投掷

java.lang.IllegalMonitorStateException


。为什么?

请参考javadoc中的Object.wait

()

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

From

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

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

@synchronized(Obj){…}类似于:
SynchronizedObject.lock()…SynchronizedObject.Unlock()

等待基本上是:
SynchronizedObject.Unlock()&SynchronizedObject.Lock()


这在我看来更清楚了……您需要有锁才能释放它

您可能正在寻找
Thread.sleep()
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!");
}