JUC-阻塞队列

阻塞队列

顾名思义:他是一个队列,都实现了BlockingQueue这个接口,且都继承了AbstractQueue这个抽象类。这里使用了模板设计模式。

  1. 第一个ArrayBlockingQueue:是一个先进先出的实现,容量的上限,即数组的大小,内部无自动扩容,必须new的时候就要指定,无默认值。使用的一个ReentrantLock与两个Condition,一个Condition的作用是数组满了,还往里面放,当前线程就会阻塞。另一个Condition的作用是数组没有东东了,还去拿的话,当前线程就会阻塞。
  2. 第二个LinkedBlockingQueue:是一个先进先出的实现,数据结构是双向链表,使用一个int变量来限制链表的节点数,节点数最大值缺省为2的31次方-1。使用两个ReentrantLock与两个Condition,生产与消费使用的不是同一把锁,因此生产与消费可以同时进行,所以里面使用AtomicInteger作为节点的计数器。保证节点计数的安全。当节点达到了阈值,还往里面添加,当前线程就会阻塞,如果节点数为0,还去拿的话,当前线程就会阻塞。
  3. 第三个PriorityBlockingQueue:数据结构是数组,内部数组会自动扩容,扩容之前会释放ReentrantLock的锁,之后使用unsafe实现了一把cas锁保证数组扩容的安全性。底层实现一定要进行元素的比较,所以要添加的元素要么实现Comparable接口或者给一个数组元素的比较器,否则就会出现强转出错异常。如果是升序方式添加的,就满足先进先出。否则不满足。
  4. 第四个DelayQueue:数据结构是数组,内部数组会自动扩容。使用优先级队里实现的延迟队列
  5. 第五个SynchronousQueue:这种阻塞队列跟JUC下Exchanger有点像的,简单介绍一下Exchanger,这个类就是奇数次调用exchange方法的线程就会阻塞,而偶数次调用exchange方法的线程,不会阻塞反而会唤醒奇数次调用exchange方法的线程。而SynchronousQueue呢,就是一个线程,记为线程A,放了一个元素之后,就会发生阻塞,直到有其他线程拿走线程A放的元素之后,线程A就会被唤醒。数据结构是一个单向链表。
  6. 第六个LinkedTransferQueue:由链表组成的无界阻塞队列。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值