我不确定它是如何完成的BlockingQueue
,但一种可能的解决方案是使用ReentrantLock
而不是synchronized
.
它具有与 相同的语义syncrhonized
,但提供了一些改进。特别是,它可以具有其他线程可以满足的几个条件wait
:
public class MyBlockingQueue<E> {
private Lock lock = new ReentrantLock();
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();
public void put(E e) {
lock.lock();
try {
while (isFull()) notFull.await();
boolean wasEmpty = isEmpty();
...
if (wasEmpty) notEmpty.signal();
} finally {
lock.unlock();
}
}
public E take() {
lock.lock();
try {
while (isEmpty()) notEmpty.await();
boolean wasFull = isFull();
...
if (wasFull) notFull.signal();
...
} finally {
lock.unlock();
}
}
...
}