摘要:整个包,按照功能可以大致划分如下锁框架原子类框架同步器框架集合框架执行器框架本系列将按上述顺序分析,分析所基于的源码为。后,根据一系列常见的多线程设计模式,设计了并发包,其中包下提供了一系列基础的锁工具,用以对等进行补充增强。
本文首发于一世流云专栏: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多线程设计模式》 结城 浩
juc-locks 锁框架早期的JDK版本中,仅仅提供了synchronizd、wait、notify等等比较底层的多线程同步工具,开发人员如果需要开发复杂的多线程应用,通常需要基于JDK提供的这些基础工具进行封装,开发自己的工具类。JDK1.5+后,Doug Lea根据一系列常见的多线程设计模式,设计了JUC并发包,其中java.util.concurrent.locks包下提供了一系列基础的锁工具,用以对synchronizd、wait、notify等进行补充、增强。
java.util.concurrent.locks包的结构如下:
包内接口和类的简单UML图如下:
本部分包含以下文章:
J.U.C之locks框架(1):接口说明
J.U.C之locks框架(2):ReentrantLock 的使用
J.U.C之locks框架(3):ReentrantReadWriteLock 的使用
J.U.C之locks框架(4):LockSupport 工具类
J.U.C之locks框架(5):AbstractQueuedSynchronizer 综述
J.U.C之locks框架(6):AbstractQueuedSynchronizer 的独占功能原理
J.U.C之locks框架(7):Condition 原理
J.U.C之locks框架(8):AbstractQueuedSynchronizer 的共享功能原理
J.U.C之locks框架(9):ReentrantReadWriteLock 原理
J.U.C之locks框架(10):更强的读写锁——StampedLock
juc-atomic 原子类框架早期的JDK版本中,如果要并发的对Integer、Long、Double之类的Java原始类型或引用类型进行操作,一般都需要通过锁来控制并发,以防数据不一致。
从JDK1.5开始,引入了java.util.concurrent.atomic工具包,该包提供了许多Java原始/引用类型的映射类,如AtomicInteger、AtomicLong、AtomicBoolean,这些类可以通过一种“无锁算法”,线程安全的操作Integer、Long、Boolean等原始类型。
所谓“无锁算法”,我们在讲juc-locks锁框架系列中,已经接触过太多次了,其实底层就是通过Unsafe类实现的一种比较并交换的算法,大致的结构如下(具体入参,根据上下文有所不同):
boolean compareAndSet(expectedValue, updateValue);
当希望修改的值与expectedValue相同时,则尝试将值更新为updateValue,更新成功返回true,否则返回false。
java.util.concurrent.atomic包结构如下:
包内类的简单UML图如下:
本部分包含以下文章:
J.U.C之atomic框架(1):Unsafe类
J.U.C之atomic框架(2):AtomicInteger
J.U.C之atomic框架(3):AtomicReference
J.U.C之atomic框架(4):Atomic数组
J.U.C之atomic框架(5):AtomicXXXFieldUpdater
J.U.C之atomic框架(6):更强的原子类——LongAdder
juc-sync 同步器框架这里的juc-sync同步器框架,是指java.util.concurrent包下一些辅助同步器类,每个类都有自己适合的使用场景:
同步器名称 | 作用 |
---|---|
CountDownLatch | 倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现了AQS框架 |
CyclicBarrier | 循环栅栏,构造时设定等待线程数,当所有线程都到达栅栏后,栅栏放行;其内部通过ReentrantLock和Condition实现同步 |
Semaphore | 信号量,类似于“令牌”,用于控制共享资源的访问数量;其内部实现了AQS框架 |
Exchanger | 交换器,类似于双向栅栏,用于线程之间的配对和数据交换;其内部根据并发情况有“单槽交换”和“多槽交换”之分 |
Phaser | 多阶段栅栏,相当于CyclicBarrier的升级版,可用于分阶段任务的并发控制执行;其内部比较复杂,支持树形结构,以减少并发带来的竞争 |
本部分包含以下文章:
J.U.C之synchronizer框架(1):倒数计数器——CountDownLatch
J.U.C之synchronizer框架(2):循环栅栏——CyclicBarrier
J.U.C之synchronizer框架(3):信号量——Semaphore
J.U.C之synchronizer框架(4):数据交换器——Exchanger
J.U.C之synchronizer框架(5):多阶段栅栏——Phaser
juc-collections 集合框架这里的juc-collections集合框架,是指java.util.concurrent包下的一些同步集合类,按类型划分可以分为:符号表、队列、Set集合、列表四大类,每个类都有自己适合的使用场景,整个juc-collections集合框架的结构如下图:
其中阻塞队列的分类及特性如下表:
队列特性 | 有界队列 | 近似无界队列 | 无界队列 | 特殊队列 |
---|---|---|---|---|
有锁算法 | ArrayBlockingQueue | LinkedBlockingQueue、LinkedBlockingDeque | / | PriorityBlockingQueue、DelayQueue |
无锁算法 | / | / | LinkedTransferQueue | SynchronousQueue |
本部分包含以下文章:
J.U.C之collections框架(1):ConcurrentHashMap的基本原理
J.U.C之collections框架(2):ConcurrentHashMap的扩容
J.U.C之collections框架(3):跳表——ConcurrentSkipListMap
J.U.C之collections框架(4):ConcurrentSkipListSet
J.U.C之collections框架(5):“写时复制”的应用——CopyOnWriteArrayList
J.U.C之collections框架(6):CopyOnWriteArraySet
J.U.C之collections框架(7):无锁队列——ConcurrentLinkedQueue
J.U.C之collections框架(8):无锁双端队列——ConcurrentLinkedDeque
J.U.C之collections框架(9):阻塞队列简介——BlockingQueue
J.U.C之collections框架(10):基于数组的阻塞队列——ArrayBlockingQueue
J.U.C之collections框架(11):基于单链表的阻塞队列——LinkedBlockingQueue
J.U.C之collections框架(12):基于堆的优先级阻塞队列——PriorityBlockingQueue
J.U.C之collections框架(13):特殊的同步队列——SynchronousQueue
J.U.C之collections框架(14):延时阻塞队列——DelayQueue
J.U.C之collections框架(15):基于双链表的阻塞双端队列——LinkedBlockingDeque
J.U.C之collections框架(16):LinkedTransferQueue
juc-executors 执行器框架executors框架是整个J.U.C包中类/接口关系最复杂的框架,executors其实可以划分为3大块,每一块的核心都是基于Executor这个接口:
线程池
Future模式
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锁框架开始,循序渐进得介绍各个框架中得多线程工具的使用方法和原理。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71505.html
摘要:注意线程与本地操作系统的线程是一一映射的。固定线程数的线程池提供了两种创建具有固定线程数的的方法,固定线程池在初始化时确定其中的线程总数,运行过程中会始终维持线程数量不变。 showImg(https://segmentfault.com/img/bVbhK58?w=1920&h=1080); 本文首发于一世流云专栏:https://segmentfault.com/blog... ...
摘要:关于接口的介绍,可以参见多线程进阶二锁框架接口。最终线程释放了锁,并进入阻塞状态。当线程被通知唤醒时,则是将条件队列中的结点转换成等待队列中的结点,之后的处理就和独占功能完全一样。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首发于一世流云的专栏:https://segmentfault.com/bl...
摘要:好了,继续向下执行,尝试获取锁失败后,会调用首先通过方法,将包装成共享结点,插入等待队列,插入完成后队列结构如下然后会进入自旋操作,先尝试获取一次锁,显然此时是获取失败的主线程还未调用,同步状态还是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首发于一世流云的专栏:https://segmentfa...
摘要:这里呢,我直接给出高并发场景通常都会考虑的一些解决思路和手段结尾如何有效的准备面试中并发类问题,我已经给出我的理解。 showImg(https://segmentfault.com/img/bV7Viy?w=550&h=405); 主题 又到面试季了,从群里,看到许多同学分享了自己的面试题目,我也抽空在网上搜索了一些许多公司使用的面试题,目前校招和社招的面试题基本都集中在几个大方向上...
摘要:关于,最后有两点规律需要注意当的等待队列队首结点是共享结点,说明当前写锁被占用,当写锁释放时,会以传播的方式唤醒头结点之后紧邻的各个共享结点。当的等待队列队首结点是独占结点,说明当前读锁被使用,当读锁释放归零后,会唤醒队首的独占结点。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首发于一世流云的专栏:...
阅读 967·2023-04-25 14:45
阅读 2715·2021-09-30 09:59
阅读 3078·2021-09-22 15:48
阅读 2389·2019-08-30 15:55
阅读 3381·2019-08-30 15:44
阅读 503·2019-08-29 14:07
阅读 3387·2019-08-26 13:45
阅读 516·2019-08-26 11:31