Java11发布,以前的并发编程知识还有用吗?

Java11都发布了,以前的并发编程知识还有用吗?

一位读者在我的12 must-reads advanced Java books 的博文中提出这么一个问题,我觉得这个问题非常不错,且非常具有代表性,所以在这里关于这个问题详细的解答一下。问题是《Java并发编程实战》是否依然适用Java8到11等不断更新的JDK版本,比如这本书的成书于2006年,当时处于1.5时代,对于内置多线程和并发支持等并发编程规范修改还在初次尝试过程中。但是,许多Java开发者也许并没有意识到API中加入的新工具,比如 CountDownLatch, CyclicBarrier, ConcurrentHashMap等等,而且在《Java并发编程实战》一书中其实也为他们提供了这些工具的无缝介绍,以及他们如何使用它们编写高性能的并发Java应用程序。

我想这是大部分Java程序员会给你的对《Java并发编程实战》的一般感觉,当你向他们询问这本书时。但是我的感觉与他们略有不同,这是我仍然推荐新Java开发人员或中级开发人员去精通掌握《Java并发编程实战》中的这些并发概念。

这本书最重要的一点是非常清晰地把并发编程的概念和基本原理讲解清楚了,比如可见性、有序性、线程安全、不可变性和并行性等。书里面也讲解了在日常应用开发中,为什么会出现哪些引起常见的竞态条件、死锁、活锁、内存数据被共享线程串改,以及一些简单的计算错误等。作者用一些不愉快的表情来帮助许多Java开发者纠正他们的错误观念。而且另外一个好处是在开发者中播种下了良好的开发习惯。毫无疑问,多线程和并发是困难的,它们很难在代码中正确使用并且难以理解和解释,我见过许多程序员,他们根本无法想象多个线程如何与具有不同数据的同一段代码进行交互。就像经典的递归概念一样,人与人的差异很大,一些程序员觉得很容易,但对于其他程序员来说太难以掌握并应用于现实世界的场景中。

《Java并发编程实战》对Java世界最大的贡献不是让并发编程更容易了,而是提供了那些清晰又标准且之前缺失的概念。从我在大量面试中总结的情况来看,多数程序员对于线程以及线程的工作原理都存在很多理解上的误区。多数4-5年工作经验的Java程序员都不知道volatile变量的工作方式,他们普遍的理解是当你使用volatile变量时,线程会一直去检查和比较主存中的该变量的值。当然,这是正确的,但不完整。他们一般不能说出Java内存模型的知识,以及更重要的一点,就是JITJVM在编译的时候会对代码做优化,优化过程中会出现代码结构顺序的变化,而volatile变量的使用,会让这些发生顺序变化的代码按原来的顺序执行。他们没有意识到volatile是如何保证在访问volatile变量到其他线程之前一个线程所做的事情的可见性。他们不知道什么是内存屏障以及它如何影响可见性。《Java并发编程实战》却把这些概念都说清楚了。事实上,我承认在阅读这本书之前,我对许多重要的多线程和并发概念有很多误解,例如: 有序性、可见性和微观变化以及安全发布,这本书帮助我理清了这些。

回到Java8,诚然,从1.5到Java8,JDK给出了很多新的工具去实现并发和设计更好的并发应用。JDK7的fork-join池,Java8中的CompleteableFutures,以及非常重要的支持函数式编程风格的Lambda表达式。你也可以采用流(Stream)和并行流,无需编程就获得并行的效果(译者:此处存疑,并发和并行的理念是不一样的)。将并发从开发人员转移到API开发人员的整体思路也使得在Java中实现并发性的过程变得更加容易并降低了风险(译者:对性能要求不高的情况下可行)。 这也意味着现在您可以使用几个方法和多个线程在Java中执行批量操作,而无需编写涉及线程、synchronized关键字或wait-notify方法的单行代码。毫无疑问,作为Java开发者,你必须学习这些新的知识和工具才能保证你的生产力不落后,这里你可以看《Java8实战》这本书,他对这些概念介绍的还是非常清楚的,对Java8的变化说明的非常全面。

即使《Java并发编程实战》在其当前状态下并未涵盖所有这些重要的概念和工具,但它仍然是学习Java编程语言、线程、并发和多线程工具的基础知识的宝贵资料。对于任何想要学习和掌握多线程和并发性的Java开发人员来说,它仍然是必读书,这是使用Java进行应用程序开发的最大优势。 Java开发人员非常感谢Brian Goetz,Joshua Bloch和所有作者给Java开发人员这样的权威书籍,以了解多线程和并发的令人困惑但关键的概念。话虽如此,像世界各地的许多Java开发人员一样,我也希望看到更新,更新的《Java并发编程实战》版本,以涵盖Java 6,7,8,9,10中引入的工具和方法。在接下来的几个月里,也许在Java 11中,就像《Effictive Java》《Head First设计模式》的更新版本一样,它涵盖了Java 8,并教你如何使用新的Java 8特性更容易实现某些模式。所以,让我们希望Brian Goetz和本书的其他作者听取这个请求,并在2018年为全世界的Java开发人员提供新版本的《Java并发编程实战》,在那之前Heinz Kabutz博士的Java Concurrency in Practice Bundle可用于让你学习到最新的知识。