当前位置: 首页 > 面试题库 >

线程可以在Java中一次在两个锁上调用wait()吗?

贲招
2023-03-14
问题内容

我一直在弄乱Java中的线程来处理它们(这似乎是最好的方法),现在了解了sync,wait()和notify()的情况。

我很好奇是否有一种方法可以同时对两个资源进行wait()。我认为以下内容并不能完全满足我的想法( 编辑
请注意,此示例中省略了通常的while循环,仅专注于释放两个资源 ):

synchronized(token1) {
    synchronized(token2) {
        token1.wait();
        token2.wait(); //won't run until token1 is returned
        System.out.println("I got both tokens back");
    }
}

在这种(非常人为)情况下,将保留token2直到返回token1,然后将保留token1直到返回token2。目标是同时释放token1和token2,然后在两者都可用时恢复(请注意,将token1.wait()移到内部同步循环之外并不是我要的)。

循环检查两者是否可用可能更适合于实现此行为(这是否接近双重检查锁定的想法?),但会占用额外的资源-我不追求明确的解决方案,因为这仅仅是满足我的好奇心

编辑 我们仅出于论证的目的而说,这里的两个标记表示线程必须同时使用的两个不同的资源,而其他一些线程将同时需要这两个资源。


问题答案:

不,不是带有标准的Java锁。虽然我猜您可以构造这样的锁。

wait应该在while循环内调用(wait可能会虚假地唤醒,并且在大多数情况下,无论如何您都希望循环)。因此,某种标志会更有意义。



 类似资料:
  • 两个线程在同一个监视器上等待,例如,如果一个线程调用等待锁,而另一个获取监视器的线程在通知第一个线程之前也调用等待。现在两个线程都在等待,但是没有人得到通知。我该怎么称呼这种情况?这能叫僵局吗? 编辑:假设只有这两个线程,并且无法从其他地方通知它们 更新:我刚刚创建了我在问题中描述的情况。当转换器线程在侦听器线程之前启动时,以下代码大部分时间都正常工作。然而,当我在changer之前启动liste

  • 问题内容: 当前,我们正在分析tomcat线程转储。在tomcat上同时运行的所有线程的单线程转储包含以下行: 特别是我们不明白 根据我们的理解,它说三个线程当时正在锁定同一监视器。根据我们的理解,根据JLS,这是不可能的。 我们对线程转储的解释正确吗? 问题答案: 看起来所有这些线程都在等待与监视器关联的条件,即它们称为该监视器的方法。 当线程在其拥有的监视器上调用时,它会临时释放监视器,并在从

  • 问题内容: 我的一项活动遇到了一个奇怪的问题。从拍照/录像回来时,我正在显示一个对话框,允许用户命名相机。用户按下“确定”后,我将使用所请求的文件名发送给主题,该主题将复制文件(并显示进度对话框)。 由于某种原因,即使我调用,总是在主线程上调用执行复制的函数。 更改呼叫以解决问题。我还是想知道为什么它不起作用… 问题答案: 并且是那里最混乱的运营商。前者确保订阅副作用在指定的调度程序(线程)上发生

  • 我写了一个启动两个线程的代码片段;一个线程打印所有奇数,而另一个线程打印所有偶数。我使用了内在锁和线程通信命令的组合来实现两个线程的正确交叉。这是我的代码, 以下是我的问题: > 奇数线程在printOdd()函数中执行,而偶数线程在print偶数()函数中执行。我对两个线程都使用一个内在锁;我不明白两个线程怎么能同时存在于各自的同步块中,因为使用了相同的锁。 我从代码中删除了线程通信语句(通知,

  • 问题内容: 我刚刚开始学习Angular.js,并且在Angular-ui中使用Carousel控件。是否可以同时显示两个幻灯片而不是一个? 我想显示这些图像- 这是一个示例- http://plnkr.co/edit/BnErmMDl8nPvXPrw3ULu?p=preview 问题答案: 您可以将图像分组在一起,也可以将其分组。除了一些所需的样式修复之外,以下是方法: http://plnkr

  • 我有多个方法,我希望有静态锁定,以便没有两个对象可以访问一个方法,但同时不同的方法不会被这些对象锁定,并且可以独立运行。 现在我希望这两个方法在被锁定时相互独立,但同时我希望同一个类的多个实例被锁定在一个方法上。 如何实现这一点?通过使用不同的类。仅仅这样做能达到目的吗?