![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
02.并发编程
qq_27264789
这个作者很懒,什么都没留下…
展开
-
分析jdk-1.8-ForkJoinPool实现原理(上)
看Kotlin的协程时,看到内部实现使用了ForkJoinPool,它实现于ExecutorService,但又和我们常用的ThreadPoolExecutor原理不同,是另一种实现方式。顾名思义,ForkJoinPool运用了Fork/Join原理,使用“分而治之”的思想,将大任务分拆成小任务分配给多个线程执行,最后合并得到最终结果,加快运算。图1 Fork/Join最核心的思想可以...原创 2019-08-29 00:15:36 · 410 阅读 · 0 评论 -
Java多线程——AQS框架源码阅读
AQS,全称AbstractQueuedSynchronizer,是Concurrent包锁的核心,没有AQS就没有Java的Concurrent包。它到底是个什么,我们来看看源码的第一段注解是怎么说明看完第一段,总结下AQS是一个同步的基础框架,基于一个先进先出的队列。 锁机制基于一个状态值,它是原子值。 AQS的子类负责定义与操作这个状态值,但必须通...原创 2019-09-04 14:14:08 · 107 阅读 · 0 评论 -
线程数究竟设置多少合理
|0需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。2|0一些共性认知在进行进一步...原创 2019-08-29 02:21:13 · 235 阅读 · 0 评论 -
分析Java延迟与周期任务的实现原理
延迟或周期执行任务可以使用Timer或者ScheduledThreadPoolExecutor,前者可以抛弃,后者是今天的主角。ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,对应执行任务变成ScheduledFutureTask。本文会在前三篇分析线程池原理的基础上,分析ScheduledThreadPoolExecutor的实现原理,最后介...原创 2019-08-29 01:48:44 · 261 阅读 · 0 评论 -
分析同步工具Semaphore和CyclicBarrier的实现原理
前两篇分别通过ReentrantLock和CountDownLatch分析了AQS的独占功能和共享功能。除CountDownLatch之外,还有Semaphore和CyclicBarrier,前者类似CountDownLatch使用AQS实现,后者使用ReentrantLock实现,本文分析一下。信号量Semaphore直接用个小例子描述信号量的用法:final Semaphore ...原创 2019-08-29 01:24:15 · 134 阅读 · 0 评论 -
分析CountDownLatch的实现原理
上一篇通过研究ReentrantLock分析了AQS的独占功能,本文将通过同样是AQS子类的CountDownLatch分析AQS的共享功能。有了前文研究独占功能的基础,再研究共享锁就简单多了。CountDownLatch的使用CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由线程进行减1操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒,实现线程间...原创 2019-08-29 01:15:56 · 72 阅读 · 0 评论 -
分析ReentrantLock的实现原理
前几篇文章分析了线程池的原理,接下来研究锁的方面。显式锁ReentrantLock和同步工具类的实现基础都是AQS,所以合起来一齐研究。什么是AQSAQS即是AbstractQueuedSynchronizer,一个用来构建锁和同步工具的框架,包括常用的ReentrantLock、CountDownLatch、Semaphore等。AQS没有锁之类的概念,它有个state变量,是个in...原创 2019-08-29 01:05:12 · 65 阅读 · 0 评论 -
分析Java线程池Callable任务执行原理
上一篇分析了线程池的执行原理,主要关于线程池的生命周期和任务如何在池里创建、运行和终止。不过上次研究的是execute方法,执行的是Runnable任务,它不返回任何值。如果希望任务完成后返回结果,那么需要使用Callable接口,这也是本文要研究的主题。ExecutorService es = Executors.newSingleThreadExecutor();Future<?...原创 2019-08-29 00:57:14 · 229 阅读 · 0 评论 -
分析Java线程池执行原理
上一篇已经对线程池的创建进行了分析,了解线程池既有预设的模板,也提供多种参数支撑灵活的定制。本文将会围绕线程池的生命周期,分析线程池执行任务的过程。线程池状态首先认识两个贯穿线程池代码的参数:runState:线程池运行状态 workerCount:工作线程的数量线程池用一个32位的int来同时保存runState和workerCount,其中高3位是runState,其余29...原创 2019-08-29 00:50:07 · 93 阅读 · 0 评论 -
分析Java线程池的创建
最近在改进项目的并发功能,但开发起来磕磕碰碰的。看了好多资料,总算加深了认识。于是打算配合查看源代码,总结并发编程的原理。准备从用得最多的线程池开始,围绕创建、执行、关闭认识线程池整个生命周期的实现原理。后续再研究原子变量、并发容器、阻塞队列、同步工具、锁等等主题。java.util.concurrent里的并发工具用起来不难,但不能仅仅会用,我们要read the fucking sourc...原创 2019-08-29 00:40:01 · 76 阅读 · 0 评论 -
分析jdk-1.8-ForkJoinPool实现原理(下)
上篇介绍了ForkJoinPool的基本结构和参数,本篇进入代码细节,一窥ForkJoinPool的实现原理。整个流程和重要方法归纳如下:任务提交提交任务入口:submit,execute,invoke 完整版提交任务:externalSubmit(包括初始化) 简单版提交任务:externalPushworker管理激活或创建:signalWork 创建:tryAddW...原创 2019-08-29 00:24:09 · 279 阅读 · 0 评论 -
Java多线程——ReentrantReadWriteLock源码阅读
之前讲了《AQS源码阅读》和《ReentrantLock源码阅读》,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内容会基于之前的基础上阅读。这个并不是ReentrantLock简单的升级,而是落地场景的优化,我们来详细了解下吧。背景JUC包里面已经有一个ReentrantLock了,为何还需要一个ReentrantReadWr...原创 2019-09-04 14:43:51 · 106 阅读 · 0 评论