阅读有关java.util.concurrent.locks.Condition接口的Java8文档,将给出以下示例:
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()一个条件,唤醒其他线程吗?这些是初学者的问题。请帮帮我。
谢谢。
发布于 2016-04-05 20:03:52
await/signal/signalAll实际上与wait/notify/notifyAll具有相同的行为。signal或signalAll时,它分别释放一个或所有等待对应Condition的线程,以便线程或这些线程有资格再次获得锁。但就目前而言,锁仍然属于调用signal或signalAll的线程,直到它通过调用lock.unlock显式释放锁为止。然后,已经/已经释放的线程将能够再次尝试获取锁,能够获得锁的线程将能够再次检查条件(在本例中,这个条件指的是count == items.length或count == 0 ),如果没有问题,它将继续进行,否则它将再次await并释放锁,使其对另一个线程可用。https://stackoverflow.com/questions/36435753
复制相似问题