【问题标题】:Can a thread call wait() on two locks at once in Java (6)Java中一个线程可以同时对两个锁调用wait()吗(6)
【发布时间】:2010-06-16 23:46:43
【问题描述】:

我一直在研究 Java 中的线程以了解它们(这似乎是最好的方法),现在了解 synchronize、wait() 和 notify() 发生了什么。

我很好奇是否有一种方法可以同时等待两个资源。我认为以下内容不会完全符合我的想法(edit请注意,此示例中省略了通常的 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 multithreading monitor wait synchronized


    【解决方案1】:

    不,不是使用标准 Java 锁。虽然我猜你可以建造这样一个锁。

    wait 应该在while 循环中调用(wait 可能会虚假唤醒,并且在大多数情况下,无论如何您都需要循环)。所以某种标志会更有意义。

    【讨论】:

    • 我想你的意思是某种标志而不是第二把锁?类似while (!flag) {token1.wait();}
    【解决方案2】:

    该示例不包括执行等待的条件。通常,等待只会发生,直到满足条件。一般来说,我认为可以通过一个锁/等待并将“token1 和 token2”抽象到条件逻辑中来完成你想要做的事情。

    例如

    synchronized(object) {
       while ((!token1ConditionMet) && (!token2ConditionMet)) {
           wait();
       }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多