2012-03-30 31 views
2

放開。如果我的代碼:當顯示器用Java

ReentrantLock lock = new ReentrantLock(); 
Condition waiting = lock.newCondition(); 

主題1:

value = default; 
    lock.lock(); 
    try { 
     waiting.await(new Long(timeout).longValue(), TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 

     } finally { 
      lock.unlock(); 
     } 

線程2:

lock.lock(); 
    //set value 
    waiting.signalAll(); 
    lock.unlock();  

我是正確的監視器上在等待被調用時釋放鎖,允許事件驅動線程2在需要時運行?如果線程2碰巧運行,線程1什麼時候能夠恢復,在signalAll()或lock.unlock()上?如果線程2發信號喚醒,但仍然有一個鎖,這是如何工作的?

回答

3

鎖實際上是在調用await時釋放。當調用signalAll時,沒有等待的線程會喚醒,直到信號線程unlock s

但是,區分Java對象監視器和Java鎖是很重要的。他們是獨立的結構,實際上的ReentrantLock /條件本身可以是在不同的上下文中的顯示器那麼你正在使用(例如,如果代替await你叫wait你會得到明顯的拋出:IllegalMonitorStateException)。

+0

感謝您的信息,我想我是混合起來的術語舊/新way-之間的一點點,但它看起來像它的同一個基本的想法,但一個是使用顯示器和其他鎖/條件。 – GBa 2012-03-30 14:04:12

+0

那是真的,那是兩種不同的機制。無論如何,如果你使用監視器,你應該在同步(監視)塊內編寫你的代碼,所以你不會有IllegalMonitorStateException。 – 2012-03-30 14:04:17

+0

@WillDen你說得對,它是一個基本的想法,'synchronized'和'ReentrantLock'具有相同的語義。 – 2012-03-30 14:10:21