代码之家  ›  专栏  ›  技术社区  ›  David Mason

在Java(6)中,线程调用wait()可以同时对两个锁执行吗

  •  0
  • David Mason  · 技术社区  · 15 年前

    我刚刚在Java中混淆视听,想弄清楚线程(这似乎是最好的方法),现在我了解了synchronize、wait()和notify()的情况。

    编辑 : ):

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

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

    编辑 为了便于讨论,我们假设这里的两个标记表示线程必须同时使用的两种不同的资源,而其他一些线程将同时需要这两种资源。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Tom Hawtin - tackline    15 年前

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

    wait while 等待

        2
  •  2
  •   btreat    15 年前

    该示例不包括执行等待的条件。通常,等待只会发生在满足条件之前。一般来说,我认为可以通过使用一个锁/等待并将“token1和token2”抽象到条件逻辑中来完成您正在尝试的任务。

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