Java多线程进阶(一)—— J.U.C并发包概述

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java多线程进阶(一)—— J.U.C并发包概述脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Java多线程进阶(一)—— J.U.C并发包概述

本文首发于一世流专栏:https://segmentfault.com/blog...

J.U.C包简介

J.U.C并发包,即java.util.concurrent包,是JDK的核心工具包,是JDK1.5之后,由 Doug Lea实现并引入。

整个java.util.concurrent包,按照功能可以大致划分如下:

  • juc-locks 锁框架
  • juc-atomic 原子类框架
  • juc-sync 同步器框架
  • juc-collections 集合框架
  • juc-executors 执行器框架

系列将按上述顺序分析J.U.C,分析所基于的码为oracle JDK1.8.0_111。

主要参考书籍

  • 《Java Concurrency in PRactice》 brian Goetz等
  • 《JAVA多线程设计模式》 结城 浩

Java多线程进阶(一)—— J.U.C并发包概述


juc-locks 锁框架

早期的JDK版本中,仅仅提供了synchronizd、wait、notify等等比较底层的多线程同步工具,开发人员如果需要开发复杂的多线程应用,通常需要基于JDK提供的这些基础工具进行封装,开发自己的工具类。JDK1.5+后,Doug Lea根据一系列常见的多线程设计模式,设计了JUC并发包,其中java.util.concurrent.locks包下提供了一系列基础的锁工具,用以对synchronizd、waIT、notify等进行补充、增强。

java.util.concurrent.locks包的结构如下:

Java多线程进阶(一)—— J.U.C并发包概述

包内接口和类的简单UML图如下:

Java多线程进阶(一)—— J.U.C并发包概述

本部分包含以下文章


juc-atomic 原子类框架

早期的JDK版本中,如果要并发的对Integer、Long、Double之类的Java原始类型或引用类型进行操作,一般都需要通过锁来控制并发,以数据不一致。

从JDK1.5开始,引入了java.util.concurrent.atomic工具包,该包提供了许多Java原始/引用类型的映射类,如AtomicIntegerAtomicLongAtomicBoolean,这些类可以通过一种“无锁算法”,线程安全的操作Integer、Long、Boolean等原始类型。

所谓“无锁算法”,我们在讲juc-locks锁框架系列中,已经接触过太多次了,其实底层就是通过Unsafe类实现的一种比较并交换的算法,大致的结构如下(具体入参,根据上下文有所不同):
boolean compareAndSet(expectedValue, updateValue);
当希望修改的值与exPEctedValue相同时,则尝试将值更新为updateValue,更新成功返回true,否则返回false。

java.util.concurrent.atomic包结构如下:

Java多线程进阶(一)—— J.U.C并发包概述

包内类的简单UML图如下:

Java多线程进阶(一)—— J.U.C并发包概述

本部分包含以下文章:


juc-sync 同步器框架

这里的juc-sync同步器框架,是指java.util.concurrent包下一些辅助同步器类,每个类都有自己适合的使用场景:

同步器名称 作用
CountDownLatch 倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现了AQS框架
CyclicBarrier 循环栅栏,构造时设定等待线程数,当所有线程都到达栅栏后,栅栏放行;其内部通过ReentrantLock和Condition实现同步
semaphore 信号量,类似于“令牌”,用于控制共享资源的访问数量;其内部实现了AQS框架
Exchanger 交换器,类似于双向栅栏,用于线程之间的配对和数据交换;其内部根据并发情况有“单槽交换”和“多槽交换”之分
Phaser 阶段栅栏,相当于CyclicBarrier的升级版,可用于分阶段任务的并发控制执行;其内部比较复杂,支持树形结构,以减少并发带来的竞争

本部分包含以下文章:


juc-collections 集合框架

这里的juc-collections集合框架,是指java.util.concurrent包下的一些同步集合类,按类型划分可以分为:符号表队列Set集合列表四大类,每个类都有自己适合的使用场景,整个juc-collections集合框架的结构如下图:

Java多线程进阶(一)—— J.U.C并发包概述

其中阻塞队列的分类及特性如下表:

队列特性 有界队列 近似无界队列 无界队列 特殊队列
有锁算法 ArrayBlockingQueue LinkedBlockingQueue、LinkedBlockingDeque / PriorityBlockingQueue、DelayQueue
无锁算法 / / LinkedtransferQueue SynchronousQueue

本部分包含以下文章:


juc-executors 执行器框架

executors框架是整个J.U.C包中类/接口关系最复杂的框架,executors其实可以划分为3大块,每一块的核心都是基于Executor这个接口:

  1. 线程池
  2. Future模式
  3. Fork/Join框架

本部分包含以下文章:

J.U.C之executors框架(1):executors框架概述
J.U.C之executors框架(2):普通线程池——ThreadPoolExecutor
J.U.C之executors框架(3):计划线程池——ScheduledThreadPoolExecutor
J.U.C之executors框架(4):Future 模式
J.U.C之executors框架(5):Fork/Join 框架的原理
J.U.C之executors框架(6):Fork/Join 框架的实现


后续文章将从juc-locks锁框架开始,循序渐进得介绍各个框架中得多线程工具的使用方法和原理。

脚本宝典总结

以上是脚本宝典为你收集整理的Java多线程进阶(一)—— J.U.C并发包概述全部内容,希望文章能够帮你解决Java多线程进阶(一)—— J.U.C并发包概述所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。