并发编程之并发队列

本文详细介绍了Java并发编程中的并发队列,包括阻塞队列和非阻塞队列。重点讲解了ConcurrentLinkedQueue、BlockingQueue及其子类ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue和SynchronousQueue的工作原理和使用场景。此外,还提到了如何使用BlockingQueue模拟生产者与消费者的场景。
摘要由CSDN通过智能技术生成

一、并发队列

在并发队列上JDK提供了两套实现,

一个是以ConcurrentLinkedQueue为代表的高性能队列非阻塞,

一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。

1、阻塞队列与非阻塞队

阻塞队列与普通队列的区别在于:

阻塞队列:

  • 当队列是空的时,从队列中获取元素的操作将会被阻塞,试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素;
  • 当队列是满时,往队列里添加元素的操作会被阻塞。试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.

2、ConcurrentLinkedQeque

ConcurrentLinkedQueue : 是一个适用于高并发场景下的队列,通过无锁的方式,实现
了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue.它
是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先
加入的,尾是最近加入的,该队列不允许null元素。

// 非阻塞式队列,无界队列
ConcurrentLinkedDeque q = new ConcurrentLinkedDeque();
    q.offer("张三");
    q.offer("李四");
    q.offer("王五");
    //从头获取元素,删除该元素
    System.out.println(q.poll());
    //从头获取元素,不刪除该元素
    System.out.println(q.peek());
    //获取总长度
    System.out.println(q.size());

3、BlockingQueue

阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:

  • 在队列为空时,获取元素的线程会等待队列变为非空。
  • 当队列满时,存储元素的线程会等待队列可用。
在Java中,BlockingQueue的接口位于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值