在Java 8和11时代,“实践中的Java并发性”这本书是否有用?

大家好!

我们今天提供的翻译文章再次回顾了Brian Goetz撰写的永不过时的书“ Java Concurrency in实践 ”的重要性。


原始文章中有关此文章的评论日期表明作者并未第一次对其进行更新和重新发布。 因此,我们还允许自己更新Raul-Gabriel Urm,Mario Fusco和Alan Mycroft在文章中提到的书的链接,该书由Manning出版,标题为Java 8 in Action。 我们正在准备一个名为Modern Java的新版本的翻译。 但是现在,让我们谈论经典。 您被邀请养猫。


昵称Shobhit的读者在有关12篇面向中级程序员的高级Java书籍的文章(第1部分)的评论中向我提出了这个问题。 这个问题确实很好,我认为许多Java程序员在我们建议有人阅读《 实践Java并发》时也有类似的疑问。 当这本书在2006年首次出版时,整个Java世界仍然无法弄清Java 1.5在竞争领域中的创新。 我认为,当时进行了第一个认真的尝试,以改善Java对多线程和竞争力的内置支持。 然后,许多程序员甚至没有怀疑API中出现的新工具,例如CountDownLatchCyclicBarrierConcurrentHashMap等。 该书将它们作为使用这些工具的调试介绍,并介绍了如何使用它们编写高性能的竞争性Java应用程序。

这正是本书的总体思路,因此,如果您问“您对“ Java Concurrency in Practice”的看法如何”,那么许多开发人员都会向您描述它。 但是,我对本书有一些不同,这就是为什么我仍然向所有熟悉Java的新手或想要学习与竞争相关的概念的中级开发人员推荐该书的原因。

本书将向您介绍的最重要的材料是竞争性编程的清晰概念和基础,尤其是可见性,顺序, 线程安全性不变性 ,并发性等。

她还解释了为什么在大多数情况下竞争性Java应用程序的拼写不正确,为什么Java程序员会犯常见错误而导致多线程问题,包括竞争条件,死锁,活动阻塞,内存干扰以及简单的错误计算。

在向读者介绍该问题的正确和高质量解决方案之前,该书使用的表情符号与“如何做错了”的描述相伴。 因此,这本书不仅有助于解决许多Java开发人员的误解,而且还可以向Java社区灌输有关如何使用多线程和竞争技术的正确信息。

毫无疑问,多线程和竞争是复杂的。 它们很难在代码中正确实现;同样难以理解和解释。 我认识很多程序员,他们根本无法直观地描绘出不同线程如何与同一代码元素交互,并使用不同的数据进行操作。

像经典的递归示例一样,对于某些程序员来说,多线程非常容易实践,而对于其他程序员,则很难理解多线程并在应用程序场景中应用。

Java《实践中的并发性》一书对Java世界的发展的最大贡献不是简化竞争,而是提供所缺乏的真实,准确的信息。 从那时起,我进行了许多采访,并且我知道程序员总是不太准确地想象流程设备及其工作方式。

许多甚至设法使用Java 4-5年的程序员都不知道可变变量是如何排列的 ; 他们所知道的是,在使用可变变量时,您需要通过每次比较来检查主存储器中的值。 这是真的,但仅是部分事实。

他们没有被告知Java内存模型,变量如何影响代码的顺序以及其核心的计算指令的执行。 它是关于使用动态编译( JIT )和Java虚拟机( JVM )进行优化的。 这种优化可能会导致细微的逻辑错误。

人们并没有被告知,可变变量是如何允许您在从另一个线程访问变量之前先查看一个线程中完成的操作的。等等。并不是每个人都知道什么是内存障碍以及它如何影响可见性。

正是从《 Java并发实践》一书中,许多Java程序员都研究了所有这些概念。 我必须承认,在阅读之前,我自己在很多方面都对多线程和竞争的许多重要问题产生了误解,尤其是最终变量和安全出版物的顺序,可见性和隐式影响。 这本书帮助我弄清楚了这一点。

顺便说一句,如果这本书的某些部分对您来说似乎有点难以理解,那就相信我,而不是一个人。 在这里,我们感谢Heinz Kabutz博士,他在Java Concurrency in Practice Bundle课程中以简化的形式概述了本书的内容。



即使对于您而言,这些材料看起来太复杂,Heinz还是开设了另一门课程“ 精通线程” ,它可以帮助理解任何普通Java程序员的多线程。

现在让我们谈谈Java 8,即从Java 1.5到Java 8的变化。JDK中出现了许多新工具,以引入竞争力并设计更具竞争力的Java应用程序。 fork-join池已出现在JDK 7中, CompleteableFutures 出现在Java 8中。 更重要的是,从Java 8开始,已修复了随lambda表达式提供的功能更强大的新编程风格。

我们还具有流和并行流,使开发人员无需编程即可利用竞争优势。 从应用程序开发人员那里获取竞争实现并将其委派给API开发人员的整个想法可以稍微简化Java竞争中的情况,并降低其实现风险。

这也意味着在Java中,您可以仅使用几种方法在多个线程中执行批量操作,而无需编写与线程相关的一行代码,synced关键字或wait和notify方法。

毫无疑问,任何Java开发人员都需要学习这些新工具,以跟上技术的发展-当然,这将对诸如Modern Java In Action之类的书有所帮助。 它不仅会向您介绍Java语言的所有创新,而且还将帮助您学习如何在日常任务中使用它们,了解这些创新的动机并获得现代Java语言的一般概念。



尽管当前形式的《 Java并发实践》一书并未涵盖所有这些重要的概念和工具,但对于探索Java语言与线程并发多线程相关的关键功能而言,它仍然具有不可估量的价值。

对于想要学习和掌握多线程和竞争力(这是Java在应用程序开发中的最大优势)的所有Java开发人员而言,Götz的书仍然是必读的书。

基于上述内容,我和世界各地的许多Java开发人员一样,希望看到Java Concurrency in Practice的更新版本,该版本将考​​虑Java 6、7、8、9、10甚至是Java中出现的工具和方法。毕竟, 已经出现有效JavaHead First设计模式的更新版本,涵盖了Java 8,并演示了使用Java 8的新功能实现各种模式要容易得多。

Source: https://habr.com/ru/post/zh-CN451322/


All Articles