2010-06-16 82 views
0

我刚刚在Java中使用线程搞乱了我的头(这似乎是最好的方法),现在了解同步发生了什么,wait()和notify()。在Java中可以同时在两个锁上调用wait()(6)

我很好奇是否有办法一次等待两个资源。我想下面就不太做我在想什么的(编辑注意,通常while循环已经离开了这个例子的重点只是腾出两种资源):

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

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

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

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

回答

2

不,不带有标准Java锁。尽管我猜你可以构建这样一个锁。

wait应该在while循环内调用(wait可能会虚假唤醒,并且在大多数情况下您仍然希望循环)。所以某种标志会更有意义。

+0

我想你的意思是某种标志,而不是第二锁?像'while(!flag){token1.wait();}' – 2010-06-17 00:30:45

2

该示例不包括待执行的条件。通常,等待只会发生,直到满足条件。一般来说,我认为只要拥有一个锁/等待并将'token1和token2'抽象到条件逻辑中,就可以完成您尝试的操作。

例如

synchronized(object) { 
    while ((!token1ConditionMet) && (!token2ConditionMet)) { 
     wait(); 
    } 
} 
相关问题