12

状態で待機する前にロックを解除する必要があるかどうか教えていただけますか?

try {
    lock.lock();
    while (isNotEmpty()) {
        condition.await();
    }
} finally {
    lock.unlock();
}

または

try {
    lock.lock();
    while (isNotEmpty()) {
        lock.unlock();
        condition.await();
    }
} finally {
    lock.unlock();
}
4

3 に答える 3

31

awaitいいえ、を呼び出す前にロックを明示的に解放する必要はありませんawait。自動的に解放されます。javadocから:

この条件に関連付けられたロックは原子的に解放され、現在のスレッドはスレッド スケジューリングの目的で無効になります[...]

と:

Conditionこのメソッドが呼び出されると、現在のスレッドはこれに関連付けられたロックを保持していると見なされます。

于 2012-07-03T10:17:41.993 に答える
4

関連付けられたものをlock()await()した場合にのみ可能ですConditionLock

条件を明確にするために isEmpty の条件を設定しないのはなぜですか。

Javadoc の例を参照してください。http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

例えば

 lock.lock();
 try {
   while (count > 0)
     isEmpty.await();
   // do something when empty.
 } finally {
   lock.unlock();
 }
于 2012-07-03T10:16:43.287 に答える
1

待機と通知は同期ブロック内で呼び出す必要があるため、同じ規則が await と signal に適用されます。自動的にリリースを待機しますが、行う場合は lock() と unlock() の間にある必要があります

lock.lock()          // start of synchronized block

condition.await()

lock.unlock()        // end of synchronized block
于 2012-07-03T10:21:48.307 に答える