我声明一个Condition类型的变量:
private Condition waitingCond;
然后,在Bridge
的构造函数中,我声明了一个与同一个变量关联的条件变量:
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()
}
}
问题:
我是否正确地说,这里方法等待释放锁?
waitingCond.await(); // waiting release lock
如果我上面说的是正确的,下面的语句是否再次启用锁定(线程持有锁)?
waitingCond.await(); // waiting release lock
nNordWaiting++; // getting back the lock
我想了解的是:waitingCond.await();
之后的任何声明都可以重新获取锁定?
非常感谢。
答案 0 :(得分:2)
来自Lock.newCondition上的documentation:
对Condition.await()的调用将在等待之前以原子方式释放锁,并在等待返回之前重新获取锁。
这意味着当调用await()时,锁被释放,但是一旦你的代码继续等待,就会自动重新获取锁。
await的文档阐述(强调我的):
与此条件相关联的锁定以原子方式释放和 当前线程因线程调度而被禁用 在四件事之一发生之前,它处于休眠状态:
- 其他一些线程调用此Condition和的signal()方法 恰好选择当前线程作为要唤醒的线程;或
- 其他一些线程为此调用signalAll()方法 条件;或
- 其他一些线程会中断当前线程,并且 支持线程暂停的中断;或
- “虚假醒来” 发生。
在所有情况下,在此方法之前可以返回当前线程 必须重新获取与此条件相关的锁。当。。。的时候 线程返回它保证保持此锁定。