【问题标题】:Android / java: synchronized object wait and notifyAndroid / java:同步对象等待和通知
【发布时间】:2017-09-16 21:33:04
【问题描述】:

我对同步方法感到困惑。看下面这段代码:

public void waitOne() throws InterruptedException
{
    synchronized (monitor)
    {
        while (!signaled)
        {
           monitor.wait();
        }
    }
}

public void set()
{
    synchronized (monitor)
    {
        signaled = true;
        monitor.notifyAll();
    }
}

现在,据我了解,同步意味着只有 1 个线程可以访问里面的代码。如果 waitOne()主线程 调用并且 set()子线程 调用,那么(从据我了解)它会造成死锁

这是因为 主线程 永远不会退出 同步(监视器),因为 while (!signaled) { monitor.wait(); },因此从子线程调用 set() 将永远无法进入同步(监控)

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

谢谢

【问题讨论】:

  • 如果您在用于同步的对象上调用wait,它将允许另一个线程访问该对象。这段代码不会死锁
  • 啊……我明白了……谢谢 0xDEADC0DE。请在上面发帖,我会接受你的回答:)

标签: java android multithreading wait notify


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看wait() 方法的文档。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 2015-01-26
      • 2023-03-27
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多