1

我声明了一个 Condition 类型的变量:

private Condition waitingCond;

然后,在BridgeI 的构造函数中声明一个与同一变量关联的条件变量:

waitingCond = lock.NewCondition(); 

然后在阻塞方法中,我有这个:

public void getIn(int direction) throws InterruptedException{
    lock.lock(); 
    try{
        if(direction == Car.DIR_NORTH){
            while((nSudWaiting>0)) 
            waitingCond.await(); 
            nNordWaiting++;  
            //...............
        } else {
            //............
        } waitingCond.signal();
    }
    finally{ 
        lock.unlock() 
    }
}

问题:

  1. 我在这里说得对吗,方法 await 意味着释放锁? waitingCond.await(); // waiting release lock

  2. 如果我上面所说的是正确的,那么下面的语句是否再次启用了锁(线程持有锁)?

    waitingCond.await(); // waiting release lock
    nNordWaiting++; // getting back the lock

我想了解的是:下面的任何语句waitingCond.await();都可以重新获取锁?

非常感谢。

4

1 回答 1

2

从Lock.newCondition的文档中:

调用 Condition.await() 将在等待之前自动释放锁,并在等待返回之前重新获取锁。

这意味着当调用 await() 时,锁被释放,但是一旦你的代码继续等待,锁会自动重新获得。

await的文档详细说明(强调我的):

与此 Condition 关联的锁被自动释放,并且当前线程出于线程调度目的而被禁用并处于休眠状态,直到发生以下四种情况之一:

  • 其他一些线程为此 Condition 调用 signal() 方法,当前线程恰好被选为要唤醒的线程;或者
  • 其他一些线程为此条件调用 signalAll() 方法;或者
  • 其他一些线程中断当前线程,支持中断线程挂起;或者
  • 发生“虚假唤醒”。

在所有情况下,在此方法可以返回之前,当前线程必须重新获取与此条件关联的锁。当线程返回时,它保证持有这个锁。

于 2012-06-03T08:53:55.963 回答