程序员书库(ID:OpenSourceTop)编译链接:https://dzone.com/articles/book-review-java-concurrency-in-practice-1
并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。并发编程是Java语言的重要特性之一,因此,也是Java程序员需要掌握的技能之一
最近读了Brian Goetz编写的《Java并发编程实战》,这是一本有关Java并发的权威指南,今天拿出来和大家分享一下
![f7fc2923b88a8387785c38f656329f85.png](https://i-blog.csdnimg.cn/blog_migrate/6f724dca952ab99e8149637542c7d1f2.jpeg)
本书深入浅出地介绍了一些复杂的编程主题,是一本完美的Java并发参考手册。书中的每一页都包含了程序员日常需要应对的问题(以及相应的解决方案),简化了一个复杂但却关键的主题——并发
阅读路线
本书主要分为四大部分内容:
第一部分解释了什么是线程以及我们使用并行处理的原因;解释了什么是线程安全以及如何使用锁(具有同步的内部锁)来实现它;学习如何在多个线程之间共享对象;如何设计线程安全类;了解如何构建语句块等
第二部分是关于构建并发应用程序。它包含有关执行程序框架,查找并行性,取消和关闭任务,线程池和GUI应用程序的信息。
第三部分是关于性能和可伸缩性以及测试并发程序。
最后一部分描述了高级主题。它包含使用ReentrantLock的显式锁。它还解释了如何构建自定义同步器。一章是关于使用非阻塞算法构建并发程序;最后一章是关于Java内存模型的,这一章非常技术性。
关于分布式系统
在现代处理器架构中,多线程和并发性已经成为一个小型的分布式系统,成为连接CPU和RAM的桥梁
事实上,cpu由控制器、运算器、存储器等部分组成,但是cpu等外部硬件设备并没有多线程的概念,只是简单的一条一条的执行机器指令。CPU上的的L1、L2和L3缓存的行为就和副本一样,显示了可调的一致性模型,编译器则会在需要的时候进行同步。
由于线程独立运行,总会有些问题出现,让程序员处理可能出现的故障是检查异常的方法之一,这种方法是可取的,但是我个人不是很喜欢异常检查,因为它们会产生许多代码复制,从而出现代码耦合,但尽管如此,异常处理可以避免运行程序线程中断,保证并发代码能正常工作
JVM相关主题
这本书对Java虚拟机并发概念已经很熟悉了,它构建了一种模式语言来讨论线程安全和性能(这是我们在并发应用程序中追求的目标)。Java的模型基于多线程和内存共享,其中虚拟线程在OS线程上1:1映射:
- 线程安全性:原子性,安全性,加锁机制,这些不算是通用术语,而是非常具体的,可以使用代码示例进行解释
- 使用同步方式保证对象在并发环境下不会不一致
- 每个概念都可以归结为基于底层Java内存模型的解释,这是jvm在实现基本操作时必须遵守的规范。
标准库
通过基本概念来理解VM中发生的事情是必要的,但是它们对于生产工作来说还不够抽象。因此,本书还解释了几个标准库的用法:
- ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现
- Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发。
- 中间件(如latches, semaphores, and barriers)用于协调线程,并防止它们相互冲突。
因此,本书的一部分重点是关于使用Java SE中的最佳工具,而不是用Object.wait()和Object.notifyAll()重新发明轮子,重新发明轮子是一项容易出错的任务,从而导致更坏的结果。
豆瓣书评:
@Charle:Java五六年算是真正入了多线程的门,这本书五星级推荐。@hoterran:并发书里最喜欢的一本,doug lea 真神人啊。@gaoyusong:工程性质比较强的一本书,更多的在讲如何做,而没有涉及到为什么这样做,读完的话能对Java并发编程有个大概的了解,能写一些比较实用的程序了。
总结
简而言之,读这本书,你务必集中精力,我花了16个小时才读了16章,对于这类技术性很强的书籍,建议在PC端阅读,用你喜欢的IDE和JUnit编写测试,对你正在学的内容进行实践,对于一些有难度的问题你还可以直接在网上的博客里找到答案。
对于分布系统中的并发,简单的测试是不够的,你很难发现问题,你需要理论支撑、代码评审和静态分析等,因此,本书就是帮助你避免出现Bug和浪费时间的工具之一