发布于 2015-04-09 16:34:09
正如在一些注释中已经提到的,第一个实现只是使用传统的wait()/notify()机制,其中一个线程等待(当然也是释放锁)以得到其他线程的通知。
第二个锁使用不同的锁,每个锁用于put和operations操作。因此,单个操作(同时进行put()或put())是同步的。但是,当队列已满或空时,它们需要相互通信。所以他们通过condition互相交流。检查一下这两种私人方法-
/**
* Signals a waiting take. Called only from put/offer (which do not
* otherwise ordinarily lock takeLock.)
*/
private void signalNotEmpty() {
final ReentrantLock takeLock = this.takeLock;
takeLock.lock();
try {
notEmpty.signal();
} finally {
takeLock.unlock();
}
}
/**
* Signals a waiting put. Called only from take/poll.
*/
private void signalNotFull() {
final ReentrantLock putLock = this.putLock;
putLock.lock();
try {
notFull.signal();
} finally {
putLock.unlock();
}
}put方法向试图从空队列获取/轮询的其他线程发送信号,take方法向其他试图将元素放入完整队列的线程发出信号。
https://stackoverflow.com/questions/29542368
复制相似问题