首页 > 其他分享 >LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、ConcurrentLinkedQueue、TransferQueue的原理与使用场景

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

时间:2022-12-21 12:01:51浏览次数:39  
标签:ConcurrentLinkedQueue 获取 SynchronousQueue 元素 LinkedBlockingQueue 队列 添加 线程


在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方法。


标签:ConcurrentLinkedQueue,获取,SynchronousQueue,元素,LinkedBlockingQueue,队列,添加,线程
From: https://blog.51cto.com/u_11970680/5959709

相关文章

  • ConcurrentLinkedQueue和ConcurrentHashMap简单介绍
    ConcurrentLinkedQueue是一个单向的链表 入队列     每次在队尾追加两个节点,才移动一次tail节点添加节点1和节点2  在添加一个节点3  step4中q为......
  • SynchronousQueue的简单介绍
    SynchronousQueue有点特殊,具备生产者和消费者,但是生产者生产后会执行阻塞,当产生的数据有人取走的时候,生产者的阻塞状态会解除,再次生产再次阻塞,再次等待消费者解锁,多个线程......
  • java15源码-SynchronousQueue
    一类图二构造方法publicSynchronousQueue(){this(false);}/***Createsa{@codeSynchronousQueue}withthespecifiedfairnesspoli......
  • Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
    上篇文章谈到BlockingQueue的使用场景,并重点分析了ArrayBlockingQueue的实现原理,了解到ArrayBlockingQueue底层是基于数组实现的阻塞队列。但是BlockingQueue的实现类中,有......
  • java15源码-LinkedBlockingQueue
    一类图二构造方法//LinkedBlockingQueue.java//take锁privatefinalReentrantLocktakeLock=newReentrantLock();//put锁privatefinalRee......
  • JAVA并发容器-ConcurrentLinkedQueue 源码分析
    在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和......
  • java-并发集合-阻塞队列 LinkedBlockingQueue 演示
    java-并发集合-阻塞队列LinkedBlockingQueue演示packageme.grass.demo.concuronte;importjava.util.Date;importjava.util.concurrent.CountDow......
  • java-并发集合-并发队列 ConcurrentLinkedQueue 演示
    java-并发集合-并发队列ConcurrentLinkedQueue演示目标:模拟5个线程同时并发读取“并发队列”,并使用CountDownLatch类协助计算消费耗时。pack......
  • SynchronousQueue详解
    SynchronousQueue介绍【1】SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take。 ......
  • LinkedBlockingQueue详解
    LinkedBlockingQueue介绍【1】LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小为Integer.MAX_VALUE,由于这个数值特别大,所以LinkedBlock......