一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后理解线程池有很有好处,SynchronousQueue是一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然.同步队列没有任何内部容量,甚至连一个队列的容量都没有. 二.SynchronousQueue数据结构 由于SynchronousQueue的支持公平策略和非公平策略,所…
问题 (1)SynchronousQueue的实现方式? (2)SynchronousQueue真的是无缓冲的吗? (3)SynchronousQueue在高并发情景下会有什么问题? 简介 SynchronousQueue是java并发包下无缓冲阻塞队列,它用来在两个线程之间移交元素,但是它有个很大的问题,你知道是什么吗?请看下面的分析. 源码分析 主要属性 // CPU的数量 static final int NCPUS = Runtime.getRuntime().availableProc…
JUC源码分析-集合篇(九)SynchronousQueue SynchronousQueue 是一个同步阻塞队列,它的每个插入操作都要等待其他线程相应的移除操作,反之亦然.SynchronousQueue 像是生产者和消费者的会合通道,它比较适合"切换"或"传递"这种场景:一个线程必须同步等待另外一个线程把相关信息/时间/任务传递给它. SynchronousQueue(后面称SQ)内部没有容量,所以不能通过 peek 方法获取头部元素:也不能单独插入元素,可以简…
上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文章来了解剩下的四种阻塞队列. 读完本文你将了解: 七种阻塞队列的后四种 DelayQueue DelayQueue 的关键属性 实现 Delayed 接口 延时阻塞队列如何实现 DelayQueue 使用场景 SynchronousQueue LinkedTransferQueue Transfer…
本文向大家展示了java阻塞队列的使用场景.源码分析及特定场景下的使用方式.java的阻塞队列是jdk1.5之后在并发包中提供的一组队列,主要的使用场景是在需要使用生产者消费者模式时,用户不必再通过多线程自己实现,可以通过阻塞队列直接实现消息的分发和消费,方便简单,降低了开发难度,在本章的最后,我们在分析阻塞队列源码时,也会有demo展示因为对代码的不了解而错误的使用阻塞队列时的灾难情况.下面列举出了所有实现BlockingQueue接口的队列:ArrayBlockingQueue.Linked…
JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlockingQueue,以便日后灵活使用. 1. 在Java的Concurrent包中,添加了阻塞队列BlockingQueue,用于多线程编程.BlockingQueue的核心方法有: boolean add(E e) ,把 e 添加到BlockingQueue里.如果BlockingQueue可以容纳,…
前言 在 SOFA-RPC 的官方介绍里,介绍了自定义线程池,可以为指定服务设置一个独立的业务线程池,和 SOFARPC 自身的业务线程池是隔离的.多个服务可以共用一个独立的线程池. API使用方式如下: UserThreadPool threadPool = new UserThreadPool(); threadPool.setCorePoolSize(10); threadPool.setMaximumPoolSize(100); threadPool.setKeepAliveTime(2…
问题 (1)LinkedTransferQueue是什么东东? (2)LinkedTransferQueue是怎么实现阻塞队列的? (3)LinkedTransferQueue是怎么控制并发安全的? (4)LinkedTransferQueue与SynchronousQueue有什么异同? 简介 LinkedTransferQueue是LinkedBlockingQueue.SynchronousQueue(公平模式).ConcurrentLinkedQueue三者的集合体,它综合了这三者的方法…
本文将主要结合源码对 JDK 中的阻塞队列进行分析,并比较其各自的特点: 一.BlockingQueue 概述 说到阻塞队列想到的第一个应用场景可能就是生产者消费者模式了,如图所示: 根据上图所示,明显在入队和出队的时候,会发生竞争:所以一种很自然的想法就是使用锁,而在 JDK 中也的确是通过锁来实现的:所以 BlockingQueue 的源码其实可以当成锁的应用示例来查看:同时 JDK 也为我们提供了多种不同功能的队列: ArrayBlockingQueue :基于数组的有界队列: Linke…
前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange -- 交换器.用于在两个线程之间交换数据,A 线程将 a 数据交给 B 线程,B 线程将 b 数据交给 a 线程. 具体使用例子参见 并发编程之 线程协作工具类.我们这篇文章就不再讲述如何使用了. 而今天,我们将从源码处分析,Exchange 的实现原理.如果大家看过之前关于 SynchronousQueue 的文章…