学习笔记 ——————LinkedBlockingQueue

LinkedBlockingQueue属性说明

字段类型含义
capacityint队列长度
countAtomicInteger队列已有元素数量
headNode队列头部节点
lastNode队列最后一个节点
takeLockReentrantLock取出节点的锁
notEmptyCondition不为空的条件,用来唤醒、通知接收处节点的线程
putLockReentrantLock添加节点的锁
notFull Condition没有满的条件,用于唤醒、通知添加节点的线程

LinkedBlockingQueue.node属性说明

字段类型含义
itemE泛型,队列袁术的具体值
nextNode<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进来一个元素后,就唤醒
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值