LinkedTransferQueue】的更多相关文章

近期在阅读开源项目里,发现有几个project都不尽同样地使用LinkedTransferQueue这个数据结构.比方netty,grizzly,xmemcache,Bonecp. Bonecp还扩展出一个BoundTransferQueue. LinkedTransferQueue最早出如今JSR66R(一个轻量级并行运行框架)包中.眼下已合并到JDK7中. JSR66的负责人正是大名顶顶的Doug Lea. 尽管LinkedTransferQueue被集成在JDK7中,但眼下主流的JDK平台…
问题 (1)LinkedTransferQueue是什么东东? (2)LinkedTransferQueue是怎么实现阻塞队列的? (3)LinkedTransferQueue是怎么控制并发安全的? (4)LinkedTransferQueue与SynchronousQueue有什么异同? 简介 LinkedTransferQueue是LinkedBlockingQueue.SynchronousQueue(公平模式).ConcurrentLinkedQueue三者的集合体,它综合了这三者的方法…
1. 前言 Java 中总的算起来有 8 种阻塞队列. 我们分析了: 并发编程之 SynchronousQueue 核心源码分析 并发编程之 ConcurrentLinkedQueue 源码剖析 并发编程之 LinkedBolckingQueue 源码剖析 在 并发编程 -- ScheduledThreadPoolExecutor 中顺带分析了 DelayWorkQueue. ArrayBlockingQueue 数组队列,我们在 使用 ReentrantLock 和 Condition 实现一…
转载请注明源出处:http://www.cnblogs.com/lighten/p/7505355.html 1.前言 本章介绍无界的阻塞队列LinkedTransferQueue,JDK7才提供了这个类,所以这个类具备了一些一般队列不具有的特性.此队列也是基于链表的,对于所有给定的生产者都是先入先出的.注意,该队列的size方法和ConcurrentLinkedQueue一样不是常量时间.由于队列的实现,其需要遍历队列才能计算出队列的大小,这期间队列发生的改变,遍历的结果会不正确.bulk操作…
因为下一节会说线程池,要用线程池 那么线程池有个很重要的参数 就是Queue的选择 常用的队列其实就两种: 先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能.从某种程度上来说这种队列也体现了一种公平性. 后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件. 常用queue的分类: ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列. LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列. Priority…
一.LinkedTransferQueue简介 TransferQueue是一个继承了BlockingQueue的接口,并且增加若干新的方法.LinkedTransferQueue是TransferQueue接口的实现类,其定义为一个无界的队列,具有先进先出(FIFO)的特性. 有人这样评价它:"TransferQueue是是ConcurrentLinkedQueue.SynchronousQueue (公平模式下).无界的LinkedBlockingQueues等的超集." Link…
昨天刚看完BlockingQueue觉得好高级啊,今天扫到1.7就发现了升级版.... 如果对内容觉得不够充分,可以去看http://www.cs.rochester.edu/u/scott/papers/2009_Scherer_CACM_SSQ.pdf 就是作者的论文啦,纯英文...比较难啃,但是我觉得逻辑上比看代码容易理解,其实代码什么u啊h啊看得很混 LinkedTransferQueue 起源: 我觉得是这样的,之前的BlockingQueue是对 读取 或者 写入 锁定整个队列,所以…
/** *LinkedTransferQueue是有容量的, * 当第一个生产者线程调用transfer时,如果没有消费者,会阻塞. * 第二个生产者线程调用transfer时,如果没有消费者,会添加到队列的末尾. * 直到有消费者进行消费时调用take方法,被阻塞的生产者线程才继续运行 */ /** * LinkedTransferQueue(后称LTQ) 采用一种预占模式.意思就是消费者线程取元素时, * 如果队列为空,那就生成一个节点(节点元素为null)入队, * 然后消费者线程被等待在…
LinkedTransferQueue 功能 全名 public class LinkedTransferQueue<E> extends AbstractQueue<E> implements TransferQueue<E>, Serializable 简述 基于链表的的无界队列.队列的头是某个生产者在队列中停留时间最长的元素.队列的尾部是某个生产者在队列中时间最短的元素. 注意,与大多数集合不同,size方法不是一个常量时间操作.由于这些队列的异步性,确定当前元素…
在JDK8的阻塞队列实现中还有两个未进行说明,今天继续对其中的一个阻塞队列LinkedTransferQueue进行源码分析,如果之前的队列分析已经让你对阻塞队列有了一定的了解,相信本文要讲解的LinkedTransferQueue的源码也能很快被理解,接下来一起学习吧 前言 JDK版本号:1.8.0_171 LinkedTransferQueue是基于链表的FIFO无界阻塞队列,在源码分析前,需要提前对源码实现整体有个印象,便于细节的理解.注释部分对于这个类进行了一些说明和介绍,如果有能力的话…
一.SynchronousQueue概述 SynchronousQueue是一个不存储元素的队列.每一个put操作必须等待一个take操作,否则不能继续添加元素. 它支持公平访问队列.默认情况下线程采用非公平性策略访问队列.SynchronousQueue类只有两个构造方法: public SynchronousQueue() { this(false); } public SynchronousQueue(boolean fair) { transferer = fair ? new Tran…
前言 LinkedTransferQueue是Java并发包中最强大的基于链表的无界FIFO阻塞传输队列.从JDK7开始出现,Doug Lea说LinkedTransferQueue是ConcurrentLinkedQueue.SynchronousQueue (公平模式下).无界的LinkedBlockingQueues等的超集,这句话就已经说明了LinkedTransferQueue的特性了,首先LinkedTransferQueue是基于链表的无界FIFO阻塞队列,它是接口Transfer…
LinkedTransferQueue LinkedTransferQueue 能解决什么问题?什么时候使用 LinkedTransferQueue? 1)LinkedTransferQueue 是基于单向链表实现的线程安全的.无界.FIFO.阻塞队列 2)执行 put 操作时,如果链表头部为阻塞的 take 线程,则直接将此元素交给它, 否则将元素添加到队列尾部,put 操作不会阻塞调用线程. 3)执行 transfer 操作的线程需要一个配对的 take 线程读取元素,否则将阻塞,反之也一样…
LinkedTransferQueue是JDK1.7才添加的阻塞队列,基于链表实现的FIFO无界阻塞队列,是ConcurrentLinkedQueue(循环CAS+volatile 实现的wait-free并发算法).SynchronousQueue(公平模式下转交元素).LinkedBlockingQueue(阻塞Queue的基本方法)的超集.而且LinkedTransferQueue更好用,因为它不仅仅综合了这几个类的功能,同时也提供了更高效的实现. BlockingQueue接口,它是指这…
JUC源码分析-集合篇(十)LinkedTransferQueue LinkedTransferQueue(LTQ) 相比 BlockingQueue 更进一步,生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事).新添加的 transfer 方法用来实现这种约束.顾名思义,阻塞就是发生在元素从一个线程 transfer 到另一个线程的过程中,它有效地实现了元素在线程之间的传递(以建立 Java 内存模型中的 happens-before 关系的方式).Dou…
目录 LinkedTransferQueue概述 TransferQueue 类图结构及重要字段 Node节点 前置:xfer方法的定义 队列操作三大类 插入元素put.add.offer 获取元素take.poll transfer.tryTransfer xfer三大流程 xfer tryAppend awaitMatch LinkedTransferQueue使用案例 总结 参考阅读 系列传送门: Java并发包源码学习系列:AbstractQueuedSynchronizer Java并…
一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(Collection<? extends E>):boolean 删: remove(Object):boolean removeAll(Collection<?>):boolean retainAll(Collection<?>):boolean removeIf(Pred…
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www.cnblogs.com/chenpi/p/5614290.html JSR 166及J.U.C 什么是JSR: JSR,全称 Java Specification Requests, 即Java规范提案, 主要是用于向JCP(Java Community Process)提出新增标准化技术规范的正式…
并发框架分类 1. Executor相关类 Interfaces. Executor is a simple standardized interface for defining custom thread-like subsystems, including thread pools, asynchronous I/O, and lightweight task frameworks. Depending on which concrete Executor class is being u…
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程.阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素. 阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put…
队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点:Queue就是电影院入场时人们排起来的进场队伍,先来的人(即:前排在前面的人)先入场,而Statck则是一队人依次进入了一个死胡同想出来,先进去(最里面)的人,必须等后面的人(后进入的人)出来了,自己才能出来. 队列在多线程应用中,常用于生产-消费场景,打个通俗的比方:很多人早上喜欢去买油条,买油条…
什么是线程 进程受CPU时间片的轮转调度,进而予人多任务并发的感觉. 线程在更低层次上扩展多任务概念,一个进程通常包含多个线程. 进程各自数据独立,而线程共享数据. 数据独立使进程相互通信变得繁难,共享数据又使线程并发暗藏风险. 创建线程的两种方式: 创建一个任务,受单独线程调度. public class Task implements Runnable { public void run() { // TODO: 具体的执行 } public static void main(String[…
在尽可能短的篇幅里,将所有List.Map.Set.Queue的特征与实现方式捋一遍.适合所有"精通Java"其实还不那么自信的人阅读. List ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此创建数组时最好能给出数组大小的预估值.默认第一次插入元素时创建大小为10的数组. 按数组下标访问元素--get(i)/set(i,e) 的性能很高,这是数组的基本优势. 直接在数组末尾加入元素--…
引言: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值. Volatile的官方定义 Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量.Java语言提供了volatile…
一.理论知识   ProGuard是一款免费的Java类文件压缩器.优化器和混淆器.它能发现并删除无用类.字段(field).方法和属性值(attribute).它也能优化字节码并删除无用的指令.最后,它使用简单无意义的名字来重命名你的类名.字段名和方法名.经过以上操作的jar文件会变得更小,并很难进行逆向工程. 二.基本使用   在Android应用程序也可以使用ProGuard来进行混洗打包,大大的优化Apk包的大小.但是注意ProGuard对文件路径的名名很有讲究,不支持括号,也不支持空格…
概要 本章对Java.util.concurrent包中的ConcurrentHashMap类进行详细的介绍.内容包括:ConcurrentLinkedQueue介绍ConcurrentLinkedQueue原理和数据结构ConcurrentLinkedQueue函数列表ConcurrentLinkedQueue源码分析(JDK1.7.0_40版本)ConcurrentLinkedQueue示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3498…
JDK提供了7中阻塞队列,这里介绍其中3中,剩余的以此类推原理相同. 1.ArrayBlockingQueue package com.seeyon.queue; import java.util.concurrent.ArrayBlockingQueue; /** * Created by yangyu on 16/11/27. */ /** * ArrayBlockingQueue是数组结构组成的有界阻塞队列 * 当队列已经满了的时候,put操作会阻塞当前线程,直到队列发生出队操作然后会唤醒…
第一节 阻塞队列 1.1 初识阻塞队列 队列以一种先进先出的方式管理数据,阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空:当队列满时,存储元素的线程会等待队列可用.在多线程进行合作时,阻塞队列是很有用的工具. 生产者-消费者模式:阻塞队列常用于生产者和消费者的场景,生产者线程可以定期的把中间结果存到阻塞队列中,而消费者线程把中间结果取出并在将来修改它们.队列会自动平衡负载,如果生产者线程集运行的比消费者线程集…
摘自:http://www.cnblogs.com/androidsuperman/p/4396889.html 首先,需要准备的工作: 1   用户协议(可以是本地html资源,也可以是通过webview调用远程url链接地址). 2    签名文件(打包签名文件,可以是公司以前这个项目的签名文件). 3    程序logo图标. 4    其他东西(版本代号,应用截图,宣传文案,宣传视频,合作首发相关信息). 需要配置的项目: 1    清理日志调用(log日志如果发版时不清处,影响应用性能…
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更多详情! 2 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元…