Android / java:synchronized对象并通知

时间:2017-04-20 10:02:01

标签: java android multithreading wait 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(); }退出同步(监控),因此从孩子那里调用 set()线程永远不能进入同步(监视器)

我是对的吗?还是我错过了什么?完整代码位于:What is java's equivalent of ManualResetEvent?

由于

2 个答案:

答案 0 :(得分:2)

当您在用于同步的对象上调用wait时,它将释放监视器,允许另一个线程获取它。这段代码不会死锁。

答案 1 :(得分:2)

查看wait()方法的文档。

  

使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。换句话说,此方法的行为就像它只是执行call wait(0)一样。

     

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

关键是线程释放监视器的所有权,因此你不会遇到死锁。子线程可以设置signaled的值,并可以通知主线程。