LinkedBlockingQueue属性说明
字段 | 类型 | 含义 |
---|---|---|
capacity | int | 队列长度 |
count | AtomicInteger | 队列已有元素数量 |
head | Node | 队列头部节点 |
last | Node | 队列最后一个节点 |
takeLock | ReentrantLock | 取出节点的锁 |
notEmpty | Condition | 不为空的条件,用来唤醒、通知接收处节点的线程 |
putLock | ReentrantLock | 添加节点的锁 |
notFull | Condition | 没有满的条件,用于唤醒、通知添加节点的线程 |
LinkedBlockingQueue.node属性说明
字段 | 类型 | 含义 |
item | E | 泛型,队列袁术的具体值 |
next | Node<E> | 当前元素的下一个节点 |
往队列中添加元素过程
队列未满,notFull.signal()唤醒阻塞在添加元素等待的等待线程 |
队列有元素,notEmpty.signal()唤醒阻塞在取出元素等待线程(需先获取takeLock锁) |
往队列中取出元素过程
队列未满,notEmpty.signal()唤醒阻塞在取出元素等待的等待过程 |
队列有元素,notFull.signal()唤醒阻塞在添加元素等待线程(需先获取putLock锁) |
添加-取出元素方法区别与对比
添加元素方法 | 作用 | 区别 |
boolean add(E e) | 添加元素 | 底层调用offer(E e)方法,offer失败则抛出异常 |
boolean offer(E e) | 添加元素 | 如果队列已满则返回失败,否则获取锁去添加元素 |
boolean offer(E e,long timeout ,TimeUnit unit) | 添加元素,超过超时时间返回 | 如果队列没满,则跟offer(E e)方法相同;如果队列已满,则等待指定时间,在指定时间内,如果队列空,则添加元素,否则超时返回False |
void put(E e) | 阻塞的添加元素 | 阻塞等待直到完成添加元素行为 |
取出元素方法 | 作用 | 区别 |
E peek() | 取出元素 | 仅仅获取元素,不会将元素从队列中删除 |
E poll() | 取出元素,并从队列中删除该元素 | |
E poll(long timeout ,Timeunit unit) | 在超时时间内,取出元素,并从队列中删除元素 | 如果队列不为空,则跟poll()方法相同;如果队列为空,则等待指定时间,在指定时间内,如果队列不为空,则取出元素,否则超时返回 |
E take() | 阻塞的取出元素 | 一直阻塞直到完成取出元素 |
- takeLock 和 notEmpty 搭配:先获取 takeLock 锁,才能到链表中获取链表第一个节点的数据。如果此时队列为空,则当前线程加入notEmpty 这个condition队列阻塞。
- putLock 需要和 notFull 搭配:先获取 putLock 锁,才能到链表中插入(put)一个元素到链尾。如果此时队列满,则当前线程加入notFull 这个condition队列阻塞。
唤醒notFull这个condition队列上的线程有两种情况:
- put、offer每次入队后,还有剩余空间
- take、poll前队列是满的,那么take走一个后,就唤醒
唤醒notEmpty这个condition队列上的线程有两种情况:
- take、poll每次取走元素后,队列中不为空
- put、offer前队列是空的,那么put进来一个元素后,就唤醒