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

不,你不需要在调用之前显式释放锁awaitawait它会自动释放。从javadoc

与此条件关联的锁被原子释放,并且当前线程被禁用以用于线程调度目的[...]

和:

调用此方法时,假定当前线程持有与此关联的锁Condition

于 2012-07-03T10:17:41.993 回答
4

您只能await()Condition您已锁定()关联的Lock

为什么你没有条件让 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

wait 和 notify 必须在同步块中调用 with,因此相同的规则适用于 await 和 signal。虽然 await 自动释放,但如果你这样做应该在 lock() 和 unlock() 之间

lock.lock()          // start of synchronized block

condition.await()

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