0

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

我很好奇是否有一种方法可以同时等待两个资源。我认为以下内容不会完全符合我的想法(编辑请注意,此示例中省略了通常的 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() 移到内部同步循环之外并不是我想要的)。

检查两者是否可用的循环可能更适合实现这种行为(这会接近双重检查锁定的想法吗?),但会占用额外的资源 - 我不是在寻求最终的解决方案,因为这只是来满足我的好奇心。

编辑让我们只是为了争论,这里的两个标记代表线程必须同时使用的两个不同的资源,而其他一些线程将同时需要这两个资源。

4

2 回答 2

2

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

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

于 2010-06-16T23:52:50.230 回答
2

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

例如

synchronized(object) {
   while ((!token1ConditionMet) && (!token2ConditionMet)) {
       wait();
   }
} 
于 2010-06-16T23:54:24.687 回答