3

「The H2O problem」という宿題があり、3 つのメソッドを持つ H2OBarrier というクラスを実装することになっています。

  • HReady、水素原子 (スレッド) の準備ができたときに呼び出されるメソッド
  • OReady、酸素原子 (スレッド) の準備ができたときに呼び出されるメソッド
  • makeWater、2 つの水素原子と 1 つの酸素原子の準備ができたときに呼び出されるメソッド

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() を呼び出す必要がありますか? プログラムの全体の流れは、私にはかなり論理的な意味があるように思えます。私がやっていることは、全体的に正しいように見えることを確認したいだけです。

4

1 に答える 1

2

あなたのコードはデッドロックを引き起こしています。5 個の o アトムが最初に通過し、5 個が await() によって生成された o キューに入ると想像してください。2 つの h アトムが通過しても問題ありません。すべての h アトムは、コードのために自動的に待機します。

于 2013-02-07T05:44:09.703 に答える