如何判断linkedblockingqueue取值到最后一个
答案:2 悬赏:10 手机版
解决时间 2021-03-23 01:37
- 提问者网友:捧腹剧
- 2021-03-22 04:35
如何判断linkedblockingqueue取值到最后一个
最佳答案
- 五星知识达人网友:神也偏爱
- 2021-03-22 05:19
搜一下:如何判断linkedblockingqueue取值到最后一个
全部回答
- 1楼网友:愁杀梦里人
- 2021-03-22 05:24
概述
LinkedBlockingQueue是java concurrent包提供的另一个多线程安全的阻塞队列,与ArrayBlockingQueu相比,此队列的使用链表实现(不熟悉链表的同学,请查阅大学的数据结构课本),可以提供高效的并发读写性能。
数据结构
链表节点
既然是链表,那么肯定少不了节点,节点自然包括节点内容和next指针。jdk开发人员,设计的节点是这样的:
static class Node<E> {
E item;
Node<E> next;
Node(E x) { item = x; }
}
在这里,用到了java范型的机制,用来保存不同类型的对象。
上述节点,提供了一个构造函数,用来传入需要保存的内容,这里的构造函数没有判断传入参数是否合法,因为在所有public方法中,已经判断过了,这里无需进行再次判断。
链表的指针
LInkedBlockingQueue中的链表,包含头指针和尾指针,其中:
头指针用来管理元素出队,和 take(), poll(), peek() 三个操作关联
尾指针用来管理元素入队,和 put(), offer() 两个操作关联
具体的数据结构定义如下:
private transient Node<E> head;
private transient Node<E> last;
链表的容量和大小
LinkedBlockingQueue是有大小限制的,当队列满后不能继续入队,同时,也有一个变量记录当前队列中的元素数量:
private final int capacity;
private final AtomicInteger count = new AtomicInteger(0); // 队列当前大小
注意:这里的count对象,是原子类型,而不是一般的int类型,与ArrayBlockingQueue中的不符,这是因为LinkedBlockingQueue使用读和写两把锁来控制并发操作,读和写可能同时修改count字段的值,而ArrayBlockingQueue只有一把锁用于控制读写操作,所以count对象是普通的,线程不安全的类型
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯