2012-06-03 32 views
1

林声明类型条件的变量:重新获取锁

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() 
    } 
} 

问题:

  1. 我是说我在这里说,这个方法等待暗示释放锁吗? waitingCond.await(); // waiting release lock

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

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

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

非常感谢。

+0

下面的答案有帮助吗?如果是这样,你应该接受它作为答案。 –

回答

2

documentation上Lock.newCondition:

到Condition.await()的调用等待并重新获得在等待返回前锁定之前,将原子释放锁。

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

await详解(重点煤矿)的文档:

与此条件相关的锁以原子方式释放和 当前线程的线程调度目的就退出, 一直处于休眠状态的四分之一发生的事情:

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

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

+0

那么我写的是正确的? waitingCond.await(); //等待释放锁 nNordWaiting ++; //取回锁 – 9628001

+1

@ user962800是的。 (好吧,迂腐和过度的字面意思不 - “nNordWaiting ++”实际上并没有“取回锁定”,它已经被重新获得了,所以更准确的评论可能是“重新获得了锁定”,并且真的重新收购发生在该声明之前。) – Corbin

相关问题