作者简介
首先要隆重介绍的肯定是《深入理解高并发编程:JDK核心技术》的作者:冰河,作为互联网资深技术专家、数据库技术专家、分布式与微服务架构专家。他多年来一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技术的研究,在高并发、高可用、高扩展性、高维护性和大数据等领域拥有丰富的架构开发经验。
不仅如此,冰河还有其他著作,比如说《可视化多数据源异构中间件mykit-data》,该书的前传《深入理解高并发编程:核心原理与案例实战》、《深入理解分布式事务:原理与实战》、《海量数据处理与大数据技术实战》、《MySQL技术大全:开发、优化与运维实战》等等。如果还想更加深入理解作者的话,下方是他在CSDN的博客链接,有兴趣的读者可以自行前往对作者冰河进行更深层次的了解:
null冰 河擅长精通大数据系列,精通Java系列,精通MySQL系列,等方面的知识,冰 河关注架构,神经网络,redis,推荐算法,tensorflow,elasticsearch,web安全,spark,devops,安全架构,linux,jenkins,mysql,hadoop,storm,网络,深度学习,自动化,系统架构,排序算法,flink,聚类,nlp,安全,系统安全,centos,分类领域.https://blog.csdn.net/l1028386804″ />
第一篇 基础篇(第1~2章)
本篇简单地介绍了进程与线程的基本概念、线程调度与上下文切换、进程与线程的综合对比、如何查看进程与线程的运行时信息,以及线程和线程组的基本操作。
进程
从某种程度上来讲,进程其实是内存中正在运行的程序实例,被分配了一定的空间,各个进程在运行的过程中互不干扰。
进程的基本概念及构成
一般来说,一个进程就是内存中正在运行的一个实例,是系统进行资源分配的基本单位。目前,大部分程序可以同时启动并运行多个进程实例,有些程序只能启动并运行一个进程实例。例如,当打开浏览器时,会启动多个进程实例;当运行 Java 程序时,会启动一个对应的JVM进程实例。进程具有动态性、并发性、独立性和异步性。·还学到了进程的以下概念:
- 进程ID:进程的唯一编号。
- 进程互斥:当多个进程操作同一个资源时,同一时刻只允许一个进程使用资源,其他进程在当前进程使用资源时必须等待,直到当前进程释放资源。·临界资源:同一时刻只允许一个进程访问的资源。
- 临界区:临界区本质上是一段代码片段,即在进程中访问临界资源的代码片段,需要保证进程互斥地进入各自的临界区。
- 进程同步:多个并发运行的进程按照一定的顺序执行的过程。
而且让我学到了:线程是CPU调度的基本单位,使用多线程编程能够更好地利用 CPU 的资源,充分发挥多核CPU的计算性能。在Java 的多线程编程中,有很多简单易用的API,使用这些API可以方便地创建线程并对线程进行操作。线程的创建方式主要包括继承Thread 类、实现Runnable接口、实现Callable 接口、FutureTask配合Thread和使用线程池5种。
第二篇 核心工具篇(第3~13章)
本篇通过大量源码和案例详细介绍了JDK的各种并发工具,涵盖同步集合、并发List集合类、并发Set集合类、并发Map集合类、并发阻塞队列、并发非阻塞队列、并发工具类、锁工具类、无锁原子类、线程工具类和异步编程工具类。几乎每个章节都配有JDK核心工具类的源码及实战案例,有助于读者理解。
让我知道了JDK提供了非常丰富的集合类、并发工具类、锁工具类、线程工具类,Java8中又新增了对并行流的操作和异步编程的工具类等,使用JDK提供的并发编程工具类能够极大地降低并发编程的复杂度。
同步集合Vector
比如说同步集合Vector:Vector 是从JDK1.0开始提供的一个线程安全的同步集合类,在某些情况下需要通过对额外的客户端或者同步集合类加锁来保护在 Vector 集合中进行的复合操作。当在Vector 集合上执行循环遍历、根据当前元素获取下一个元素,或者根据某一条件执行后续逻辑等复合操作时,如果有其他线程并发修改 Vector 集合中的元素,就会出现线程安全问题。
并发集合CopyOnWriteArrayList
还有并发集合:Java 并发包中的并发 List 集合只有CopyOnWriteArrayList 使用时复制技术,添加、修改或删除 CopyOnWriteArrayList 中的数据都是基于底层数组的一个进行的,CopyOnWriteArrayList 类是线程安全的类。每个CopyOnWriteArrayList类内部都有一个对象数组类的成员变量 array 用来指向存体元素的数组,还会有一个 ReentrantLock 独占锁类型的成员变量 lock 用来保证在同一时能有一个线程修改 array 数组中的数据。CopyOnWriteArrayList 类的类继承CopyOnWriteArrayList 类实现了 List 接口,CopyOnWriteArrayList前层本质上是一个数组。这个数组的读操作会直接返回原数组中的值:这个数组的写操作(创添加元素、修改元素和删除元素 )会首先获取 ReentrantLock 独占锁,然后复制一份底层影array 的副本,在 array 数组副本上进行写操作,在执行完毕后,再将 array 数组的副本赋值给引用。
第三篇 线程池核心技术篇(第14~16章)
本篇深入剖析了JDK中线程池的核心源码。包括线程池顶层接口和抽象类、线程池正确运行的核心流程、线程池执行任务的核心流程、Worker线程的核心流程、线程池优雅退出的核心流程、ScheduledThreadPoolExecutor类与Timer类的区别、定时任务线程池的初始化、调度流程和优雅关闭流程等。通过对本篇的学习,读者能够从源码级别深刻理解线程池的核心原理和执行流程。
在真实高并发场景下,一般不会直接使用 Thread 类创建线程,而是使用线程池来创建并管傅线程。可以这么说,学好线程池对于并发编程是非常重要的。
线程池简介
线程池的创建和回收是一个非常消耗系统资源的过程,如果在系统中频繁地创建和回收线程,会极大降低程序的执行性能。并且,短时间内创建大量的线程可能造成 CPU 占用 100%、死机或内存溢出等问题。而使用线程池就能非常轻松地解决这些问题。
线程池核心类继承关系
线程池是 Java 从JDK 1.5 版本开始提供的一种线程使用模式,能够自动创建和回收线程,并管理线程的生命周期。在线程池中能够管理和维护多个线程。
Java 的线程池主要是通过 Executor 框架实现的,涉及 Executor 接口、ExecutorServcie 接口、AbstractExecutorService 抽象类、ScheduledExecutorService 接口、ThreadPoolExecutor 类和ScheduledThreadPoolExccutor类。实现线程池最核心的类是 ThreadPoolExecutor,而 ScheduledThreadPoolExecutor 类实现了定时任务功能,能够使提交到线程池中的任务定时、定期执行。为了便于创建线程池,JDK 还提供了一个 Executors 工具类,Executors 类中封装了创建线程池的名种方法,专门用于创建线程池。不过,在真实的高并发场景下,并不推荐使用 Execulors 工具类创建线程池,而是推荐直接使用 ThreadPoolExecutor类创建线程池。