条件 - 应该在等待之前解锁?

2022-09-04 06:01:38

你能告诉我是否应该在等待之前释放锁吗?

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

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

答案 1

不需要,调用前不需要显式释放锁,会自动释放它。来自 javadocawaitawait

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

和:

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


答案 2

您只能在 一个 上 锁定()关联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();
 }

推荐