Java 并发编程实战

< Java 并发编程实战 > (Java Concurrency in Practice) 其实翻译的不准确, Java 并发编程实践会比较好吧. 我花了大概一周的时间看完了这本书, 期间工作日上班累了就偷懒不看, 所以其实大部分都是在周末看完的. 看完这本书我学到了一个道理, 那就是我基本不可能通过看一本书而精通书里边所讨论的议题, 比如并发编程、C++ 编程思想、如何阅读一本书之类的书, 至今为止我也没有办法像 < 如何阅读一本书 > 中那样去阅读一本书. 但这并不妨碍我看这本书, 我是有收获的, 至少我有一个印象, 而且它也印证了一些我之前有过的认识并给与了一些新的认识.

JCP 就是这样子. 书里边详细讨论了在 Java 编程语言中并发的概念、Java 语言提供的工具类、并发的问题、如何测试等等议题. 验证了一些我之前已有的观点: 基本上并发编程的难点就在于维护状态变量的一致性, 并且通过 JDK 提供的工具类来简化并发编程. 一句话概括了. 然后我也知道不少我没有认识到观点: 线程安全不仅仅是加锁, 也可以是线程封闭; 并发编程不仅仅关乎执行的乱序性, 也关乎内存可见性. final 字段不仅提供了引用不可变性, 还提供了内存可见性, 只要可以访问这个 final 字段, 那么其状态一定已经初始化好了; 将数据封装在对象内部不仅是良好的面向对象原则, 同时也是良好的并发编程原则; 等等不一而足.

在此值得一提的是第 12 章并发程序的测试, 读完这一章之后我觉得我所写的任何跟并发有关的代码都没有经过深思熟虑. 线程数量、缓存大小的配置, 使用哪一种加锁方式, 甚至使用不同的操作系统都对程序的性能有影响. 它给了若干启发, 当我们进行调优时不应该以自己的主观臆测(在请求到来的速度, 调用并发的程度这些方面我有不少同事假设过高)去推断这样改了之后会更好, 最好是可以在实际程序运行中测量得到; 测量的手段, JVM 提供了不少程序性能, 故障方面的测量手段, 这对于调优会很有帮助的, 之前一直想不同怎样去优化一个没有错误的程序提高它的响应速度和吞吐量. 即便是不适用 JVM 提供的测量手段, 也可以通过记录运行时间来定位热点;

JCP 说明了不少提高并发编程性能的原则: 减小锁的范围, 减少锁的粒度, 调整适当的线程数, 使用非阻塞同步机制. 这些工作的目标在于减少因过多切换线程带来的开销. 以及一些安全性原则: 不要在构造函数中逸出 this 指针; 不在持有锁的时候阻塞; 对于多把锁使用相同的加锁顺序; 尽量状态变量的同步委托给线程安全对象; 将条件队列与锁分离等等;

以上都是在 Java 并发编程实战这本书的冰山一角, 其里边所提到的问题, 对没有用过 Java 并发编程的程序员来说是较为抽象的. 在学习任何一本书之前, 如果可以先尝试一些入门的文档, 阅读一些相关的代码, 甚至有了一些这方面的编程经验, 阅读起这种系统性介绍的书籍来说一定是事半功倍的. 之所以会对技术书如此抗拒, 觉得会如此枯燥, 跟对相关概念没有一个比较好的了解是有关的. 而且在阅读技术书是遇到难以理解的地方何妨跳过呢? 或许某一天有了相关方面的经验再来看时, 它变得很容易懂了.

Leave a Reply

Your email address will not be published. Required fields are marked *