2013-02-06 171 views
3

我有一個家庭作業任務,稱爲「H2O問題」,我應該實現一個名爲H2OBarrier有3種方法的類。正確的鎖定/解鎖使用Java的可重入鎖

  • HREADY,當氫原子(線程)準備好一個稱爲方法
  • OReady,當氧原子(線程)是被稱爲方法準備
  • makeWater,被叫方法時2個氫原子和一個氧原子準備好了

我應該使用Java Reentrant鎖和條件來做到這一點。

這是我的代碼到目前爲止,我想知道如果我正確使用鎖定和解鎖。

public class H2OBarrier { 

int hCount; 
int oCount; 

Lock lock = new ReentrantLock(); 
Condition hWait = lock.newCondition(); 
Condition oWait = lock.newCondition(); 

public void HReady() { 
    lock.lock(); 
    hCount++; 

    try { 
     hWait.await(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

public void OReady(){ 
    lock.lock(); 
    oCount++; 

    try { 
     while(hCount<2 && oCount<1){ 
      oWait.await(); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     makeWater(); 
    } 


} 

public void makeWater(){ 
    hCount--; 
    hWait.signal(); 
    lock.unlock(); 

    hCount--; 
    hWait.signal(); 
    lock.unlock(); 

    oCount--; 
    oWait.signal(); 
    lock.unlock(); 

} 

} 

我應該在我的makeWater方法以外的任何地方調用unlock()嗎?整個程序流程似乎對我來說非常合乎邏輯,我只想確保我所做的整體看起來是正確的。

+0

我確實經歷了這一點,但我不確定在我的OReady和HReady方法中調用unlock()是否有意義。或者你主要是指我沒有使用try/catch/finally語句? – Hoser

+0

我用try塊更新了它 – Hoser

回答

2

您的代碼正在產生死鎖。設想5個O原子首先經過,5進入由await()產生的隊列。現在,如果2個h原子通過,所有的h原子都會因爲您的代碼而自動等待,這並不重要。

+0

是的,我可以看到。謝謝你的收穫。 – Hoser