【发布时间】:2016-08-01 03:08:22
【问题描述】:
我在https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html 上阅读了有关该问题的信息。
这是文档中关于这两种情况的说明:
我们希望继续等待 put 线程和 take 线程分开 等待集,这样我们就可以使用只通知一个的优化 当项目或空间在 缓冲。这可以使用两个 Condition 实例来实现。
我可以使用一个条件通知单个线程,因为signal() 唤醒了一个线程:
class BoundedBuffer2 {
final Lock lock = new ReentrantLock();
final Condition condition = 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)
condition.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
condition.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
condition.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
condition.signal();
return x;
} finally {
lock.unlock();
}
}
}
为什么我们需要两个条件?
【问题讨论】:
标签: java multithreading synchronization producer-consumer java.util.concurrent