《Java 9 Concurrency Cookbook》阅读小结

每次我看书都是有“冲动”的缘由的,这次看这本书也不例外。客观上讲作为一名Java程序员,如果一开始就上来看java多线程,java并发编程很可能会打击你的信心,我记得我很久之前就买过一本关于java多线程编程的纸质书——《Java并发编程实战》

这本书我当时看了一点点就基本上放弃了,不是我觉得这本书写得不好,而是我实在没有办法看完,因为里面有太多的东西,我都没有见过。所以很长时间以来,我觉得那个多线程编程很高级,别人一谈及“高并发,线程安全”等等问题,我都也只是听一听,略当了解。

其实在技术道路上我也有自己的箴言——你不知道那门技术,那是因为那门技术蒙了一层面纱,学习新技术就是揭开面纱的过程。这是一种乐观的心态,因为总是有“谣言”说学习是一件痛苦的事情,学习是件寂寞的事情。而我们的乐观心态会促使我们有一种新的体验——就像过去新郎揭开新娘的面纱一样,我们是拥有着激动的心颤抖的手的状态,热烈而好奇,紧张而激动,期待着美好。

然而时间还是悄悄地过去了3年,这段时间我开始接触到了Java多线程编程,还有就是经常听到的“高并发”,其实除了在API层或者在网关层我们使用一些技术去应对高并发,在java层面我们写的Java业务代码也是需要应对高并发,实现多线程编程的。尽管java一直在简化我们多线程编程的难度,但是我们作为Java多线程编程的学习者和实践者,我们还是需要了解一下整个Java多线程技术的发展史和体系结构。

也是机缘巧合,我看了这本《Packt.Java.9.Concurrency.Cookbook.2nd.Edition.2017.4》

之前的那本《 Java并发编程实战 》我借给之前的同事看了,然后我就网上找原版的(最近一直在看英文版技术书),找是找到了结果由于排版问题看得比较不是很舒服,我就偶然搜索到上面这本书。本来是想着看看写的怎么样,之前我看的英文书主要是O’Reilly 或者Manning出版的,这次是第一次看Packt出版的书。

这本书的写作风格大致是分5步讲一个Recipe
Getting ready
How to do it…
How it works…
There’s more…
See also
看起来排版清楚,组织合理,而且还是讲代码的,中间会穿插对代码的解释。所以一路看下来也是水到渠成的,很自然,就没有想过要中途放弃。最后我也是把里面的代码看完了然后”native”了一下上传到了github上。

总体而言,这本书还是很值得读一下的。我结合我自己的理解先说说java多线程开发的历史。

在Java 1.0就引入线程Thread类、 Runnable接口,然后Java 到了1.5时,Java迎来一个值得历史纪念版本Java 1.5, 在这本版本中多线程编程就简化了很多,提供了很多了工具类或者说是底层代码。之前多线程编程时经常需要使用到synchronized关键字,然后就是从Object中继承过来的wait(), notify(),notifyAll(),现在有了轻量级的同步机制volatile关键字,还有整个juc(java.util.concurrent)包。当然juc里面还分了atomic和locks子包。Lock(锁机制就是这时候引入的),还有我们说的AtomicInteger(原子整数),支持原子操作,对应的是我们常看见的i++。同时还引入了阻塞队列、并发集合、线程池。然后Java到了 1.7时,又引入了一个新的Fork/Join 框架,然而如果你不了解juc,你可能也就只是停留在听说过这个词,最多知道这个框架是把任务大的化为小的,如果还是大了,就再化小,依次进行。然后Java到了 1.8(以后都叫java 8\ java 9\ java 10 …), java进一步简化并发编程,引入Stream,同时开启多线程处理的任务就“简单”了很多,在API调用层面,基本上看不到线程/线程池/同步/锁等等一些列“底层”的东西,我们只需要”简单”地调用一下parallel()就可以并行地去处理任务。然后到了java 9, 又引入了一个VarHandle,可能你没有直接用过。

这段简史我虽然只用了一段文字来概括,因为里面的内容很多,随便挑一个估计都会说上半天。

我们在来总览一下这边本书——
《Packt.Java.9.Concurrency.Cookbook.2nd.Edition.2017.4 》,我们可以先看一下目录

一共分了11章:
第一章:线程管理
第二章:基本线程同步
第三章:线程同步工具类
第四章:线程执行器
第五章:Fork/Join 框架
第六章:并行和响应式流
第七章:并发集合
第八章:定制并发类
第九章:测试并发应用
第十章:额外信息
第十一章:并发编程设计

上面的内容组织也基本上是按照我之前提到的java中多线程编程的发展历史一一展开的除了把并发集合放到了后面。这本书主要是讲应用和概念,所以在深度上不是特别投入,但是足够你了解juc,让你揭开这层面纱。

看完之后我们对java中juc这个包以及里面的绝大数的类有一个认识,但是在实际工作中我们可能会遇到一些应用上的问题,这些书只是一个理论基础,包括其中的源码也是一样。

我们先简单看一下juc包

这是总览,再看一下atomic子包

最后看一下locks子包

看完这本书后,就不会对juc这个包下这么多的类和接口感到陌生了,更多了应该是熟悉,因为基本上都直接或者间接用过一边了。我们现在可以这么看,先看接口,然后再看实现类就比较清晰了。

先看这张基本图:

由于之前是 Runnable ,没有返回值,现在是 Callable 带有返回值T,所以在上面的图中我把FutureTask显示出来,这样就体现 了对Thread扩展开放。

再看一张关于并发集合的图:

再瞄一眼一个有趣的类的层次结构:

关于线程池我们也可以看一眼:

记在最后:看完全书,你会有一个比较好的总览概念,就像juc的鸟瞰图一样,当然这是并发编程的一个偏介绍性知识,还有很多比较深的东西,比如原理之类的,还是需要深入到源码层面和实际工作的应用才会有更深的体会。
流年笑掷,未来可期