【发布时间】:2025-12-15 17:40:02
【问题描述】:
阅读关于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()现在满足条件,如果等待缓冲区未满的线程尚未释放锁,则释放锁?
这些都是初学者的问题。请帮帮我。
谢谢。
【问题讨论】:
标签: java multithreading concurrency locking java.util.concurrent