[英]Android / java: synchronized object wait and notify
我对同步方法感到困惑。 请看下面的代码:
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(); }
while (!signaled) { monitor.wait(); }
因此调用从子线程组()将永远无法进入同步(显示器)?
我对吗? 还是我错过了什么? 完整的代码在这里: 什么是Java相当于ManualResetEvent?
谢谢
当您在用于同步的对象上调用wait
时,它将释放监视器,允许另一个线程获取它。 这段代码不会死锁。
看看wait()方法的文档。
导致当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。 换句话说,此方法的行为就像它只是执行调用wait(0)一样。
当前线程必须拥有此对象的监视器。 线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。 然后线程等待,直到它可以重新获得监视器的所有权并继续执行。
关键点是线程释放了监视器的所有权,因此你不会遇到死锁。 子线程可以设置signaled
的值,并可以通知主线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.