PriorityBlockingQueue源码
2021-08-18 10:03:04 4 举报
PriorityBlockingQueue
作者其他创作
大纲/内容
当前线程放入notEmpty条件队列(读线程队列)并挂起当前线程
return result
lock.lockInterruptibly()
阻塞获取
notEmpty.await()
true
根据是否有比较器选择不同的方法
finally
lock.unlock()
判断是否需要扩容即元素个数达到了数组容量
take
while ( (result = dequeue()) == null)
lock.lock()
true默人使用二叉堆插入元素
if (cmp == null)
offer(E e)
notEmpty.signal()
1.扩容是会先解除offer()方法中加的锁,这样的话,扩容操作和读操作可以同时进行,提高吞吐量2.容量小于64,则扩容为oldCap + 23.容量大于64,则扩容1.5(oldCap >> 1)4.使用allocationSpinLock变量的CAS操作来控制扩容的过程5.创建新数组 ,拷贝旧数组数据到新的
put(E e)
siftUpUsingComparator
队列没有元素,就阻塞在notEmpty条件上 出队成功,就跳出这个循环
false自定义比较器
siftUpComparable
插入的节点如果比父节点小,交换它们,然后继续和父节点比较,直达大于父节点
while ((n = size) >= (cap = (array = queue).length))
插入元素完毕,唤醒等待读取的线程
0 条评论
下一页