我对同步方法感到困惑。请看下面的代码:
public void waitOne() throws InterruptedException
{
synchronized (monitor)
{
while (!signaled)
{
monitor.wait();
}
}
}
public void set()
{
synchronized (monitor)
{
signaled = true;
monitor.notifyAll();
}
}
现在,根据我的理解,synchronized意味着只有1个线程可以访问里面的代码。如果主线程调用 waitOne(),子线程调用 set(),则(来自据我所知,它将创建死锁。
这是因为主线程永远不会因为while (!signaled) { monitor.wait(); }
退出同步(监控),因此从孩子那里调用 set()线程永远不能进入同步(监视器)?
我是对的吗?还是我错过了什么?完整代码位于:What is java's equivalent of ManualResetEvent?
由于
答案 0 :(得分:2)
当您在用于同步的对象上调用wait
时,它将释放监视器,允许另一个线程获取它。这段代码不会死锁。
答案 1 :(得分:2)
查看wait()方法的文档。
使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。换句话说,此方法的行为就像它只是执行call wait(0)一样。
当前线程必须拥有此对象的监视器。 线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后该线程等待,直到它可以重新获得监视器的所有权并继续执行。
关键是线程释放监视器的所有权,因此你不会遇到死锁。子线程可以设置signaled
的值,并可以通知主线程。