重新获得锁定

时间:2012-06-03 08:45:11

标签: java multithreading locking

我声明一个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() 
    }
}

问题:

  1. 我是否正确地说,这里方法等待释放锁? waitingCond.await(); // waiting release lock

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

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

  3. 我想了解的是:waitingCond.await();之后的任何声明都可以重新获取锁定?

    非常感谢。

1 个答案:

答案 0 :(得分:2)

来自Lock.newCondition上的documentation

  

对Condition.await()的调用将在等待之前以原子方式释放锁,并在等待返回之前重新获取锁。

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

await的文档阐述(强调我的):

  

与此条件相关联的锁定以原子方式释放和   当前线程因线程调度而被禁用   在四件事之一发生之前​​,它处于休眠状态:

     
      
  • 其他一些线程调用此Condition和的signal()方法   恰好选择当前线程作为要唤醒的线程;或
  •   
  • 其他一些线程为此调用signalAll()方法   条件;或
  •   
  • 其他一些线程会中断当前线程,并且   支持线程暂停的中断;或
  •   
  • “虚假醒来”   发生。
  •   
     

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