一、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?

最新文章

  1. Beta版本冲刺第四天
  2. 【10-26】java调试技术学习笔记
  3. 基于Yahoo网站性能优化的34条军规及自己的见解
  4. $watch 和 $apply
  5. Android 获取JSP或ASP的sessionId(Cookie)
  6. sqlserver exists和in 与exists和not in
  7. GLSL中的各种变量总结
  8. Python系列之lambda、函数、序列化
  9. 文本与二进制关于\n的问题
  10. Ubuntu14.04server + LNMP + Zabbix3.4安装教程
  11. uva 1583
  12. IntelliJ IDE 基础经验备案
  13. input file实现多选和限制文件上传类型
  14. Python——Window启动服务
  15. buffer格式的转换
  16. uva-317-找规律
  17. 【题解】 POJ 1201 Intervals(差分约束)
  18. .Net Core配置文件读取整理
  19. 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
  20. Terminal shortcuts

热门文章

  1. 自动构建的deploy.sh
  2. Tensorflow&CNN:裂纹分类
  3. 使用DateTimeFormatter替换线程不安全的SimpleDateFormat
  4. re模块及其用法
  5. HTTP 状态码(常见及分析)
  6. PL/SQL使用游标CURSOR
  7. 使用 ajax 多次请求,并将结果集合并(ajax 非异步)
  8. list获取所有上级
  9. CF798D Mike and distribution 贪心
  10. PHP的输出语法