美文网首页
线程学习记录09-并发Queue

线程学习记录09-并发Queue

作者: 绝世懒人 | 来源:发表于2017-06-24 17:03 被阅读0次

一、
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列。一个是以blockingQueue接口为代表的阻塞队列。

image.png

二、

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

ConcurrentLinkedQueue的重要方法:
add()和offer()都是加入方法(两者并无啥区别,只是因为Queue接口要求了实现,在其他实现类里面这两个方法就能有不同的功能)
poll()和 peek()都是取头元素的节点,区别在于前者会删除,后者不会。

BlockingQueue接口:
ArrayBlockingQueue:基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象。其内部没有实现读写分离,也就意味了生产和消费不能并行,长度是需要定义的。可以指定先进先出或者先进后出,也叫有界队列,适用于很多场景。
LinkedBlockingQueue:基于链表的阻塞队列,同ArrayBlockingQueue类似。其内部也维持着一个数据缓冲队列。LinkedBlockingQueue之所以能够高效的处理并发数据,是因为其内部实现采用分离锁,从而实现生产者和消费者并发运行。它是一个无界队列。
SynchronousBlockingQueue: 一种没有缓冲的队列,生产者生产的数据会直接被消费者获取并消费。
PriorityBlockingQueue:基于优先级的阻塞队列(传入队列的对象必须实现Comparable接口),在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁,他也是一个无界队列。
DelayQueue: 带有延迟时间的Queue,其中的元素只有当其指定的延迟时间到了,才能够从队列中获取该元素。DelayQueue中的元素必须实现Delayed接口。DelayQueue是一个没有大小限制的队列, 应用场景很多。比如对缓存超时的数据进行移除,任务超时处理,空闲连接的关闭等等。

三、
主要的是ArrayBlockingQueue、LinkedBlockingQueue、SynchronousBlockingQueue三个队列。ArrayBlockingQueue适用于当数据量很多时,指定一定长度的数据避免存储的数据过大,多余的线程就处于阻塞状态。LinkedBlockingQueue适用于一定范围内的数据量,原则上没有上限,也可以通过构造器指定长度大小变成有界队列。一般适用于距离预期目标有允许有一定偏差的场景。SynchronousBlockingQueue适用于极少数数据的场景,没必要对数据进行缓存让消费者直接获取数据。三个缓存可以在一定场景下,根据不同的时间,状态进行切换。

相关文章

  • 线程学习记录09-并发Queue

    一、在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列。一个是...

  • JAVA非并发容器--ArrayDeque, LinkedLis

    概述 queue/deque非并发容器意义不大,因为queue在工程实践中天生就是多个线程操作的,只有并发的que...

  • GCD的基本使用

    1、异步函数+并发队列(会开多条线程,任务是并发执行的) 1、1创建并发队列 dispatch_queue_t q...

  • iOS GCD简单总结

    队列:串行队列、并发队列 线程:同步、异步 系统提供的两个队列:dispatch_get_main_queue()...

  • 线程中级篇(一):基本并发容器

    传统的容器并没有实现线程安全,所以在多线程的情况下,并不管用。本文首先自己手写一个并发Queue引出全文: 并发类...

  • Python爬虫(五)--多线程续(Queue)

    本文希望达到的目标: 学习Queue模块 将Queue模块与多线程编程相结合 通过Queue和threading模...

  • iOS GCD Grop Queue 队列组

    当遇到需要执行多个线程并发执行,然后等多个线程都结束之后,再汇总执行结果时可以用group queue 使用场景:...

  • GCD异步编程中串行和并行的区别

    三种Queue main queue 主线程队列 global queue 全局队列 开启一个异步线程 for i...

  • GCD解析

    GCD是属于系统级别的线程管理,在Dispatch queue中执行需要执行的任务,性能非常高·基于队列的并发编程...

  • java学习记录--ThreadLocal使用案例

    java学习记录--ThreadLocal使用案例 标签(空格分隔): java 本文借由并发环境下使用线程不安全...

网友评论

      本文标题:线程学习记录09-并发Queue

      本文链接:https://www.haomeiwen.com/subject/bfukcxtx.html