3

我有一个名为“H2O 问题”的家庭作业,我应该在其中实现一个名为 H2OBarrier 的类,它有 3 个方法。

  • HReady,当一个氢原子(线程)准备好时调用的方法
  • OReady,当氧原子(线程)准备好时调用的方法
  • makeWater,当两个氢原子和一个氧原子准备好时调用的方法

我应该使用 Java 可重入锁和条件来执行此操作。

到目前为止,这是我的代码,我想知道我是否正确使用了锁定和解锁。

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() 吗?该程序的整个流程对我来说似乎非常合乎逻辑,我只是​​想确保我正在做的事情总体上看起来是正确的。

4

1 回答 1

2

您的代码正在产生死锁。想象一下 5 个原子首先通过,5 个进入由 await() 生成的 o 队列。现在,如果 2 h 个原子通过并不重要,所有的 h 个原子都会因为您的代码而自动等待。

于 2013-02-07T05:44:09.703 回答