阅读有关java.util.concurrent.locks.Condition
接口的Java 8文档,给出了以下示例:
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
所以我的主要问题是:条件如何运作?
notFull.await()
)?signal()
条件,唤醒其他线程吗?signal()
现在满足条件,如果线程没有释放锁等待缓冲区未满,则释放锁? 这些是初学者的问题。请帮帮我。
谢谢。
答案 0 :(得分:2)
await/signal/signalAll
实际上与wait/notify/notifyAll
signal
或signalAll
时,它分别释放一个线程或等待相应Condition
的所有线程,以使线程或那些线程有资格再次获取锁。但是现在锁仍然由调用signal
或signalAll
的线程拥有,直到它通过调用lock.unlock
显式释放锁。然后已经释放的线程将能够尝试再次获取锁定,可以获取锁定的线程将能够再次检查该条件(这次我的意思是条件count == items.length
或者在此示例中为count == 0
,如果没有问题,它将继续,否则它将再次await
并释放锁定以使其可用于另一个线程。