
本书从实际需求出发,全面细致地介绍了JDK高并发编程的基础知识、核心工具和线程池核心技术。通过阅读和学习本书,读者可以对JDK高并发编程有更加全面、深入、透彻的理解,提高对高并发编程问题的处理能力和项目实战能力,并提高站在更高层面解决高并发编程系统架构问题的能力。
前言 为什么要写这本书 随着计算机与互联网技术的不断发展,CPU硬件的核心数也在不断提升,并发编程越来越普及,但是并发编程并不像其他业务那样简单明了。在编写并发程序时,往往会出现各种各样的Bug,这些Bug常常以某种“诡异”的形式出现,然后迅速消失,并且在大部分场景下难以复现。所以,高并发编程着实是一项让程序员头疼的技术。在“冰河技术丛书”之“深入理解高并发编程”系列的第1部作品——《深入理解高并发编程:核心原理与案例实战》一书中,全面细致地介绍了高并发编程的基础知识、核心原理、实战案例和系统架构等内容,帮助读者从根本上理解并发编程出现各种Bug的根源,并从原理与实战层面找到解决问题的方案。 本书是“冰河技术丛书”之“深入理解高并发编程”系列的第2部作品,从实际需求出发,全面细致地介绍了JDK高并发编程的基础知识、核心工具和线程池核心技术。每个章节根据实际需要配有相关的原理图、流程图和实战案例。在线程池核心技术篇,还提供了完整的手动编写线程池的案例源码。 通过阅读和学习本书,读者可以更加全面、深入、透彻地理解JDK高并发编程知识,提高对高并发编程问题的处理能力和项目实战能力,并提高站在更高层面解决高并发编程系统架构问题的能力。 读者对象 ?互联网行业从业人员 ?高校师生 ?中高级开发人员 ?架构师 ?技术经理及技术专家 ?对高并发编程感兴趣的人员 本书特色 1. 系统介绍JDK高并发编程的图书 目前,图书市场少有全面细致地介绍有关JDK高并发编程的基础知识、核心工具和线程池核心技术的图书。本书从以上三方面入手,全面、细致并且层层递进地介绍了JDK高并发编程相关知识。 2. 大量图解和开发案例 为了便于理解,笔者在介绍JDK高并发编程的基础知识和核心工具章节中会配有适量的图解和图表,以及对应的实战案例。在线程池核心技术章节中会配有完整的手写线程池案例。读者按照本书的案例学习,并运行案例代码,能够更加深入地理解和掌握相关知识。另外,这些案例代码和图解的draw.io原文件会一起收录于随书资料里。读者也可以访问下面的链接,获取完整的实战案例源码和相关的随书资料。 ?GitHub:https://github.com/binghe001/mykit-concurrent-jdk。 ?Gitee:https://gitee.com/binghe001/mykit-concurrent-jdk。 ?GitCode:https://gitcode.net/binghe001/mykit-concurrent-jdk。 3. 技术点与案例结合 对于JDK高并发编程的各项技术,书中都配有相关的典型案例,具有很强的实用性,方便读者随时查阅和参考。 4. 具备较高的实用价值 本书中大量的实战案例来源于笔者实际的工作总结,尤其是核心工具篇与线程池核心技术篇涉及的内容,具有非常高的参考与实用价值。 本书内容及知识体系 第一篇 基础篇(第1~2章) 本篇简单地介绍了进程与线程的基本概念、线程调度与上下文切换、进程与线程的综合对比、如何查看进程与线程的运行时信息,以及线程和线程组的基本操作。 第二篇 核心工具篇(第3~13章) 本篇通过大量源码和案例详细介绍了JDK的各种并发工具,涵盖同步集合、并发List集合类、并发Set集合类、并发Map集合类、并发阻塞队列、并发非阻塞队列、并发工具类、锁工具类、无锁原子类、线程工具类和异步编程工具类。几乎每个章节都配有JDK核心工具类的源码及实战案例,有助于读者理解。 第三篇 线程池核心技术篇(第14~16章) 本篇深入剖析了JDK中线程池的核心源码。包括线程池顶层接口和抽象类、线程池正确运行的核心流程、线程池执行任务的核心流程、Worker线程的核心流程、线程池优雅退出的核心流程、ScheduledThreadPoolExecutor类与Timer类的区别、定时任务线程池的初始化、调度流程和优雅关闭流程等。通过对本篇的学习,读者能够从源码级别深刻理解线程池的核心原理和执行流程。 为了进一步加深读者对线程池的理解,在本篇的随书源码中,会给出完整的手写线程池的案例程序。 如何阅读本书 ?没有使用过JDK的核心工具和线程池进行高并发编程,或者对高并发编程技术掌握薄弱的读者,建议从第1章开始顺序阅读,并实现书中的每一个案例。 ?有一定多线程和并发编程基础的读者,可根据自身实际情况,有选择性地阅读相关篇章。 ?对本书中涉及的高并发编程案例,读者可以先自行思考其实现方式,再阅读相关内容,以达到事半功倍的学习效果。 ?先阅读一遍书中的高并发编程案例,再阅读各技术对应的JDK底层源码,理解会更加深刻。 勘误和支持 由于作者的水平有限,编写时间仓促,书中难免会出现一些错误或者不妥之处,恳请读者批评指正。如果读者对本书有任何建议或者想法,请联系笔者。也可以将勘误信息提交到随书源码的勘误.md文件中。 ?微信:hacker_binghe。 ?邮箱:1028386804@qq.com。 ?公众号:冰河技术。 如果想学习更多有关高并发编程的知识,可以关注“冰河技术”微信公众号及冰河的个人博客站点阅读相关的技术文章。冰河的个人博客站点如下。 ?GitHub站点:https://binghe001.github.io。 ?GitCode站点:https://binghe.gitcode.host。 致谢 感谢蒋涛(CSDN创始人、总裁)、邹欣(CSDN副总裁)、李海翔(腾讯数据库资深研究员、首席架构师)、林子熠(阿里巴巴JVM技术专家、CCF系统软件专委会执行委员)、于君泽(资深技术专家、公众号“技术琐话”作者)、沈剑(互联网架构专家,公众号“架构师之路”作者)、秦金卫(长亮科技平台技术部副总经理、Apache Dubbo/ShardingSphere PMC)、张开涛(《亿级流量网站架构核心技术》作者)、季敏(Seata开源社区创始人)、李鹏云(杭州任你说智能科技CTO)、程军(前饿了么技术总监,公众号“军哥手记”作者)、骆俊武(京东零售架构师)、纯洁的微笑(公众号“纯洁的微笑”作者)、黄哲铿/Mr.K(“顿悟山丘”咨询创始人、公众号“技术领导力”作者)、李伟(Apache RocketMQ北京社区联合发起人 && Commiter)、翟永超(公众号“程序猿DD”维护者、《Spring Cloud微服务实战》作者)(以上排名不分先后)等行业大佬对本书的大力推荐。 感谢冰河技术社区的兄弟姐妹们,感谢你们长期对社区的支持和贡献。你们的支持是我写作的最大动力。 感谢我的团队和许许多多一起合作、交流过的朋友们,感谢博客、公众号的粉丝,以及在我博客、公众号留言及鼓励我的朋友们。 感谢电子工业出版社博文视点的编辑张晶,在这几个月的时间中始终支持我写作,在你的鼓励和帮助下,我顺利完成全部书稿。 感谢我的家人,他们都在以自己的方式在我写作期间默默地给予我支持与鼓励,并时时刻刻为我灌输着信心和力量! 最后,感谢所有支持、鼓励和帮助过我的人。谨以此书献给我最亲爱的家人,以及众多关注、认可、支持、鼓励和帮助过我的朋友们! 冰 河
基础篇 第1章 进程与线程的基本概述 1 1.1 进程 1 1.2 线程 6 1.3 线程调度与上下文切换 11 1.4 进程与线程的综合对比 14 1.5 查看进程与线程 14 第2章 线程的基本操作 23 2.1 创建线程 23 2.2 线程的基本操作 30 2.3 线程组 38 工具篇 第3章 同步集合 45 3.1 Vector同步集合类及案例 45 3.2 Stack同步集合类及案例 49 3.3 Hashtable同步集合类及案例 51 3.4 同步包装器及测试 53 3.5 同步集合的缺陷 56 第4章 并发List集合类 60 4.1 CopyOnWriteArrayList概述 60 4.2 写时复制技术 61 4.3 初始化 64 4.4 添加数据 65 4.5 读取数据 65 4.6 修改数据 66 4.7 删除数据 69 4.8 遍历数据 70 4.9 使用案例 72 第5章 并发Set集合类 74 5.1 CopyOnWriteArraySet集合类 74 5.2 ConcurrentSkipListSet集合类 84 第6章 并发Map集合类 93 6.1 ConcurrentHashMap集合类 93 6.2 ConcurrentSkipListMap集合类 121 第7章 并发阻塞队列 135 7.1 并发阻塞队列简介 135 7.2 ArrayBlockingQueue 139 7.3 LinkedBlockingQueue 148 7.4 PriorityBlockingQueue 152 7.4.1 概述 152 7.5 DelayQueue 158 7.6 SynchronousQueue 163 7.7 LinkedTransferQueue 167 7.8 LinkedBlockingDeque 175 7.9 并发阻塞队列案例 181 第8章 并发非阻塞队列 188 8.1 并发非阻塞队列简介 188 8.2 ConcurrentLinkedQueue 193 8.3 ConcurrentLinkedDeque 201 第9章 并发工具类 209 9.1 CountDownLatch工具类 209 9.2 CyclicBarrier工具类 213 9.3 Phaser工具类 217 9.4 Semaphore工具类 225 9.5 Exchanger工具类 229 第10章 锁工具类 233 10.1 Lock接口 233 10.2 Condition接口 236 10.3 ReentrantLock可重入锁 240 10.4 ReadWriteLock读写锁 245 10.5 StampedLock读写锁 248 10.6 锁性能对比案例 259 第11章 无锁原子类 264 11.1 无锁原子类简介 264 11.2 操作基本类型的原子类 265 11.3 操作引用类型的原子类 269 11.4 操作字段类型的原子类 273 11.5 操作数组类型的原子类 277 11.6 累加器类型的原子类 281 11.7 性能对比案例 285 第12章 线程工具类 295 12.1 Thread类 295 12.2 ThreadLocal类 306 12.3 Fork/Join框架 306 12.4 线程工具类案例 307 第13章 异步编程工具类 312 13.1 Callable接口 312 13.2 Future接口 319 13.3 CompletableFuture 330 13.4 CompletionService 338 线程池技术篇 第14章 线程池总体结构 343 14.1 线程池简介 343 14.2 线程池顶层接口和抽象类 347 第15章 线程池核心流程 357 15.1 线程池正确运行的核心流程 357 15.2 线程池执行任务的核心流程 362 15.3 Worker线程的核心流程 367 15.4 线程池优雅退出的核心流程 373 第16章 定时任务线程池 378 16.1 ScheduledThreadPoolExecutor类与Timer类的区别 378 16.2 定时任务线程池的初始化 380 16.3 定时任务线程池的调度流程 380