前言
笔者在以前的工作中很少使用并发编程,大部分应用场景都用一个线程池去异步执行一个任务,对线程的理解和研究确实不多。
2017年笔者创业的时候,从一名开发工程师转成一名讲师,当时的课程设计中包含并发编程这部分内容,因为在很多一二线互联网公司的面试中,并发编程几乎是必然会问的问题,而绝大部分学员对并发编程的理解也都停留在使用阶段。
为了讲好并发编程这块内容,笔者不得不深入研究和学习,以便更好地输出高质量的内容。从那以后,笔者买了市面上几乎所有有关并发编程的书,通过搜索引擎查找了几乎所有的并发编程学习资料,惊讶地发现并发编程这个领域知识体系非常庞大。同时,随着对并发编程的深入研究,笔者发现里面有大量的设计思想(比如分而治之)非常值得学习和研究,这也使得笔者迷恋上了并发程序设计。
这4年来,笔者几乎把核心组件的设计思想、源码和原理全部细致地分析了一遍,收获颇丰。笔者原本计划在2019年时写并发编程相关的书,把自己的收获写下来分享给读者,但是当时感觉对并发编程的理解还不够成熟,而且市面上有写得非常不错的书,笔者在课程中也强烈推荐过。
今年决定写这本书,一方面是因为笔者认为自己对并发编程的理解已经足够输出一些有价值的内容,另一方面是因为从学员中了解到,市面上的相关图书要么内容太松散,要么太高深,初学者看起来费劲,有经验的读者学起来又总觉得少了些什么。写这本书应该是一个水到渠成的过程,笔者想弥补市面上这类书在编写上的不足,同时想把这4年来对并发编程的理解和自己的并发程序设计经验分享出来,让各位读者都能轻松地掌握晦涩难懂的并发编程知识。
另外,笔者在写书之前,自认为对并发编程的理解足够深刻,但是在整理成书的时候,还是有很多收获,特别是当把一些复杂的内容转换为图形的时候,不仅仅需要理解当前技术,还需要更进一步地理解相关的理论基础和关联技术的原理。
本书涵盖Java整个并发编程体系的核心库和核心类的使用及原理分析,有六大特色。
特色一:每一个知识点都是以垂直化设计的方式进行分析和展开的,以synchronized关键字为例:
• 首先从并发编程的原子性问题引入,了解为什么需要synchronized及怎么使用synchronized。
• synchronized作为独占锁的实现必然存在互斥变量,所以深入讲解了synchronized锁的存储原理。
• 接着从锁存储延展到Mark Word对象头,以及从对象头继续延展到缓存行及其填充机制。
• 另外,从synchronized锁的性能方面切入,了解锁升级的实现及原理。
在很多技术类图书中都存在这样一个问题,就是对一些技术的分析只关注当前技术本身的广度,对深度及关联技术的说明不够,导致很多读者在阅读的时候因为一个不明白的问题而影响对知识点的理解。
特色二:内容聚合度较高。针对一个技术点,纵向分析这个技术点的所有相关内容,并且对相关知识点进行了非常详细的说明。读者在阅读的时候,不会因为对部分扩展知识不理解而导致对技术理解得不够深刻。
特色三:站在架构实践的角度来看待并发。本书对很多技术点的分析,都站在一个设计者的视角来展开。比如在线程池章节中,笔者会分析线程池的特性,以及如果自己来设计应该如何考虑和实现,这对开发者来说能够开拓技术思维和提升技术高度。
特色四:大量的图形设计简化了对复杂技术的理解,平均每个章节的图片数量在30张左右,非常有利于读者对技术点的理解。
特色五:本书涵盖的内容非常全面,并且由浅入深地进行递进性的分析,读者在学习的时候,能够自然形成对并发编程的体系化积累。
特色六:考虑到很多读者在实际工作中很少使用并发编程,本书涵盖了大量实战案例,可以帮助读者理解各类技术在实际应用中的使用方法。
笔者花费了4年时间,虽然投入了大量精力对并发编程进行了深入的研究,但在写这本书的时候,仍然有不少收获。在写作过程中,笔者希望把自己对并发编程的理解和收获全部写进来。当然,笔者也确实尽力这么做了,因此对各位读者来说,这应该是一本非常值得阅读的书。本书提供所有源码,具体下载方式可以参考下方(或封底)的“读者服务”。
由于并发编程体系涉及的技术面非常广,书中难免会存在一些错误,恳请各位读者在阅读本书的时候,如果发现错误,及时反馈给出版社,笔者会及时纠正。
谭锋(Mic)
2021年8月1日