}
}
/**
-
获取元素操作
-
@return
-
@throws InterruptedException
*/
public E take() throws InterruptedException {
lock.lock();
try {
// 当数组为空时,调用notEmpty.await();使得获取元素的线程阻塞
while (count =
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
= 0) {
notEmpty.await();
}
E ret = items[head];
items[head] = null;
if (++head == items.length) {
head = 0;
}
–count;
// 唤醒插入元素的线程
notFull.signalAll();
return ret;
} finally {
lock.unlock();
}
}
}
上述案例中的tail、head、count有不大看的懂的,我做了个简单的的put(E e)和take()的图解
Condition实现的阻塞队列put(E e)图解
Condition实现的阻塞队列take()图解
4、Condtion 实现源码分析
4.1 互斥锁和读写锁中Condition的构造
4.1.1 AbstractQueuedSynchronizer中的ConditionObject
ReentrantLock与ReentrantReadWriteLock中的静态内部类Sync继承了AbstractQueuedSynchronizer,两者调用的sync.newCondition(),实际上调用的是new ConditionObject(),也就是构造的AbstractQueuedSynchronizer中的ConditionObject对象。
public class ConditionObject implements Condition, java.io.Serializable {\
/** 双向链表首节点*/
private transient Node firstWaiter;
/** 双向链表尾节点*/
private transient Node lastWaiter;
public C