概述
LinkedBlockingQue是一个基于链表实现的可设置容量的无界(最大值Integer.MAX_VALUE)阻塞队列。队头的元素是插入时间最长的,队尾的元素是最新插入的。新的元素将会被插入到队列的尾部。
1、数据结构
基于链表,所以队列中至少有一个空元素,头结点不含元素。
2、原理
LinkedBlockingQueue中有两把锁,takeLock和putLock,即读写各一把锁。这就意味着只有读读、写写互斥,读写可以同时进行。
为了保证读写操作过程中队列元素个数的可见性和原子性,队列的元素变量count类型为AtomicInteger,且只在读写锁定过程中对其值进行增减,后面源码部分会涉及到。
3、 源码解读
3.1 变量
LinkedBlockingQueue
阻塞队列中定义了入队锁putLock
、出队锁takeLock
及其相关的两个Condition
对象notFull
、notEmpty
,容量capacity
、队头head
、队尾last
节点、队列中元素数量count
。
不再做详细介绍。
3.2 构造方法
LinkedBlockingQueue
的构造方法有三个,分别如下:
- 未设置容量大小,默认容量大小为
Integer.MAX_V