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()嗎?整個程序流程似乎對我來說非常合乎邏輯,我只想確保我所做的整體看起來是正確的。
我確實經歷了這一點,但我不確定在我的OReady和HReady方法中調用unlock()是否有意義。或者你主要是指我沒有使用try/catch/finally語句? – Hoser
我用try塊更新了它 – Hoser