1

タイプ条件の変数を宣言しています:

private Condition waitingCond;

次に、I のコンストラクターでBridge、同じ変数に関連付けられた条件変数を宣言します。

waitingCond = lock.NewCondition(); 

次に、ブロッキングメソッドでは、これがあります:

public void getIn(int direction) throws InterruptedException{
    lock.lock(); 
    try{
        if(direction == Car.DIR_NORTH){
            while((nSudWaiting>0)) 
            waitingCond.await(); 
            nNordWaiting++;  
            //...............
        } else {
            //............
        } waitingCond.signal();
    }
    finally{ 
        lock.unlock() 
    }
}

質問:

  1. ここで、メソッド await はロックの解放を意味すると言っているのは正しいでしょうか? waitingCond.await(); // waiting release lock

  2. 上記の説明が正しければ、次のステートメントはロックを再び有効にしますか (スレッドがロックを保持します)?

    waitingCond.await(); // waiting release lock
    nNordWaiting++; // getting back the lock

私が理解したいのは、次のようなステートメントwaitingCond.await();はロックを再取得できるかということです。

どうもありがとう。

4

1 に答える 1

2

Lock.newConditionのドキュメントから:

Condition.await() の呼び出しは、待機する前にロックをアトミックに解放し、待機が戻る前にロックを再取得します。

これは、await() が呼び出されるとロックが解放されることを意味しますが、コードが await を超えて続行すると、ロックは自動的に再取得されます。

awaitのドキュメントには詳細が記載されています (強調は私のものです):

この Condition に関連付けられたロックはアトミックに解放され、現在のスレッドはスレッド スケジューリングの目的で無効になり、次の 4 つのいずれかが発生するまで休止状態になります。

  • 他のスレッドがこの Condition の signal() メソッドを呼び出し、現在のスレッドがたまたま起動されるスレッドとして選択されます。また
  • 他のスレッドがこの Condition の signalAll() メソッドを呼び出します。また
  • 他のスレッドが現在のスレッドに割り込んでおり、スレッド中断の中断がサポートされています。また
  • 「偽のウェイクアップ」が発生します。

いずれの場合も、このメソッドが返される前に、現在のスレッドはこの条件に関連付けられたロックを再取得する必要があります。スレッドが戻ると、このロックを保持することが保証されます。

于 2012-06-03T08:53:55.963 に答える