LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、ConcurrentLinkedQueue、TransferQueue的原理与使用场景

在jdk中有许多的队列,队列的使用还是有一些难度的,因为涉及到了并发等概念,现在我们列举一下队列的特点:

  • 并发情况下不会有线程安全问题
  • 队列都有元素
  • 都有添加(生产者端使用)、获取(消费者端使用)功能
  • 基本上的使用场景都是在多线程、高并发的场景
    在jdk中的队列有如下几种:

1、LinkedBlockingQueue

LinkedBlockingQueue是使用比较多的队列,在SingleThreadPool(单个线程的线程池)、FixedThreadPool(固定线程数的线程池)使用的都是LinkedBlockingQueue。
1、在LinkedBlockingQueue中有两个ReentrantLock,takeLock和putLock分别是在添加元素和取出元素的时候添加的锁。
2、LinkedBlockingQueue是无界队列。

2、ArrayBlockingQueue

ArrayBlockingQueue是有界队列,在阿里的开源框架RocketMq中就使用到了,其添加和获取都是用的同一个ReentrantLock。

3、SynchronousQueue

SynchronousQueue是只有一个元素的队列,

  • 其添加和获取方法都用到了transfer方法
    public boolean offer(E e) {
        if (e == null) throw new NullPointerException();
        return transferer.transfer(e, true, 0) != null;
    }
    public E take() throws InterruptedException {
        E e = transferer.transfer(null, false, 0);
        if (e != null)
            return e;
        Thread.interrupted();
        throw new InterruptedException();
    }

其是根据是否有元素来区分是添加元素还是获取元素。

  • 其有两种元素添加获取方式,非公平获取和公平获取
    非公平用的是TransferStack,是后进先出的方式
    公平方式用的是TransferQueue,是先进先出方式
  • 加锁是用的CAS的方式替换
    使用场景:在CachedThreadPool线程池中,使用到了SynchronousQueue。

4、ConcurrentLinkedQueue

ConcurrentLinkedQueue数据结构进行了非常巧妙的设计,在添加是从tail节点,获取是从head节点,而且做到了方并发,因为不用锁,所以效率更高。
在netty的读取byteBuffer和获取Selector中都用了ConcurrentLinkedQueue。具体详细原理,可以网上搜索,在此不再赘述

5、LinkedTransferQueue

LinkedTransferQueue是jdk才出现的队列,是LinkedBlockingQueue、SynchronousQueue、ConcurrentLinkedQueue的超集,实现了他们三个的功能,其添加和获取都是用的xfer方法。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值