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

时间:2010-06-16 23:46:44

标签: java multithreading monitor wait synchronized

我一直在乱用Java中的线程来了解它们(这似乎是最好的方法)并且现在了解同步,wait()和notify()会发生什么。

我很想知道是否有办法在两个资源上同时等待()。我认为以下内容不会完全符合我的想法(编辑请注意,通常的while循环已被排除在此示例之外,只关注释放两个资源< / em>的):

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()不是我得到的。)

检查两者是否可用的循环可能更适合实现此行为(这是否接近双重检查锁定的想法?),但会耗尽额外的资源 - 我不是在一个明确的解决方案之后这只是为了满足我的好奇心。

编辑让我们只是为了参数说这里的两个令牌代表线程必须同时使用的两个不同的资源,而其他一些线程需要同时使用两个

2 个答案:

答案 0 :(得分:2)

不,没有标准的Java锁。虽然我猜你可以构建这样的锁。

应该在wait循环中调用

whilewait可能会虚假地唤醒,在大多数情况下,您仍然需要循环)。所以某种旗帜会更有意义。

答案 1 :(得分:2)

该示例不包括执行等待的条件。通常,只有在满足条件之前才会进行等待。一般来说,我认为通过单一锁定/等待并将'token1和token2'抽象为条件逻辑,我们可以完成你想要的工作。

例如

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