012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue

Posted bjlhx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue相关的知识,希望对你有一定的参考价值。

一、SynchronousQueue概述

  SynchronousQueue是一个不存储元素的队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。

  它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。SynchronousQueue类只有两个构造方法:

public SynchronousQueue() 
    this(false);

 
public SynchronousQueue(boolean fair) 
    transferer = fair ? new TransferQueue<E>() : new TransferStack<E>();

  使用第二个构造方法可以创建公平性访问的SynchronousQueue,如果设置为true,则等待的线程会采用先进先出的顺序访问队列。

  SynchronousQueue可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。队列本身并不存储任何元素,非常适合传递性场景。SynchronousQueue的吞吐量高于ArrayBlockingQueue和LinkedBlockingQueue。

二、LinkedTransferQueue概述

LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。

LinkedTransferQueue采用一种预占模式。意思就是消费者线程取元素时,如果队列不为空,则直接取走数据,若队列为空,那就生成一个节点(节点元素为null)入队,然后消费者线程被等待在这个节点上,后面生产者线程入队时发现有一个元素为null的节点,生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回。我们称这种节点操作为“匹配”方式。

LinkedTransferQueue是ConcurrentLinkedQueue、SynchronousQueue(公平模式下转交元素)、LinkedBlockingQueue(阻塞Queue的基本方法)的超集。而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现。

参看地址:https://blog.csdn.net/qq_38293564/article/category/7681703/1?

以上是关于012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet

Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

JUC - 多线程之Callable;集合类线程不安全

Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

JUC并发编程 共享模式之工具 JUC 线程安全的集合类 -- 线程安全的集合类概述