转自:https://segmentfault.com/a/1190000015558984
并发
为了追求更高的计算速度,硬件工程师们将单核cpu扩展为多核cpu,在这样的背景下,而软件行业也为了更充分的利用硬件资源研发出了多线程编程。多线程编程将cpu的计算能力发挥的淋漓尽致,应用程序的性能也得到极大的提升。
java并发编程图解
J.U.C包简介
J.U.C边发包,就是JDK的核心工具包,java.util.concurrent包,此包在老版本JDK中只是有 synchronizd、wait、notify这些常用的工具类,而这些基础的工具类并不能实现复杂的并发编程。需要程序员自行封装并发模块来执行特定的业务场景。
juc-locks锁框架、juc-atomic原子类框架、juc-sync同步器框架、juc-collections集合框架、juc-executors执行器框架
juc-locks锁框架
JDK1.5+后,Doug Lea根据一系列常见的多线程设计模式,提供了一些锁工具,用来对synchronizd、wait、notify进行增强和补充。
juc-locks的结构
UML图
juc-atomic 原子类框架
之前对java原始类型和引用类型的并发操作都是通过锁机制来实现。在JDK1.5之后,引入了java.util.concurrent.atomic,里边包含AtomicInteger、AtomicLong、AtomicBoolean等java原始与引用类型的映射类,他们采用的是"无锁算法",可以实现线程安全的操作Integer、Long、Boolean等类型。
juc-atomic结构图
UML图
juc-sync 同步器框架
JDK1.5之后还引入了同步器类,针对不同的场景有不同的同步器。
对应关系如下:
同步器名称 | 作用 |
CountDownLatch | 倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现了AQS框架 |
---|---|
CyclicBarrier | 循环栅栏,构造时设定等待线程数,当所有线程都到达栅栏后,栅栏放行;其内部通过ReentrantLock和Condition实现同步 |
Semaphore | 信号量,类似于“令牌”,用于控制共享资源的访问数量;其内部实现了AQS框架 |
Exchanger | 交换器,类似于双向栅栏,用于线程之间的配对和数据交换;其内部根据并发情况有“单槽交换”和“多槽交换”之分 |
Phaser | 多阶段栅栏,相当于CyclicBarrier的升级版,可用于分阶段任务的并发控制执行;其内部比较复杂,支持树形结构,以减少并发带来的竞争 |
juc-sync 同步器框架
JDK1.5之后还引入了同步器类,针对不同的场景有不同的同步器。
对应关系如下:
juc-collections 集合框架
J.U.C中还有对集合类的同步工具,根据类型可以划分为:符号表、队列、Set集合、列表,这个针对不同的场景也有不同的类,
结构如下图:
阻塞队列的分类及特性如下表:
队列特性 | 有界队列 | 近似无界队列 | 无界队列 | 特殊队列 |
---|---|---|---|---|
有锁算法 | ArrayBlockingQueue | LinkedBlockingQueue、LinkedBlockingDeque | / | PriorityBlockingQueue、DelayQueue |
无锁算法 | / | / | LinkedTransferQueue | SynchronousQueue |
juc-executors 执行器框架
executors里边采用的是线程池机制,在使用过程中可以通过线程的启动、执行、关闭来实现并发编程的操作。
Executors框架主要包含的模块有:线程池、Executor,Executors,ExecutorService、CompletionServince,Future、Callable。