繁体   English   中英

Android / java:synchronized对象并通知

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM