当前位置: 代码迷 >> 综合 >> 学习笔记 ——————LinkedBlockingQueue
  详细解决方案

学习笔记 ——————LinkedBlockingQueue

热度:80   发布时间:2023-11-07 14:11:36.0

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进来一个元素后,就唤醒