内核专家 Bryan Cantrill 和 Jeff Bonwick 在 2008 年 9 月的《ACM Queue》上发表了《Real-world
Concurrency》
一文,提出了 15 条并发编程的建议,这里简单摘录如下。注:Bryan Cantrill 是 dtrace
的主要作者,Jeff Bonwick 是 ZFS 和 Slab allocator 的发明者。
1. Know your cold paths from your hot paths.
弄清楚代码里的热门执行路径和冷门执行路径。
对冷门路径,用粗粒度的锁即可。对热门路径——也就是那些必须高度并发才能实现所期望的高吞吐量的代码,应该更加小心,加锁的策略必须简单明了且细粒度。
2. Intuition is frequently wrong—be data intensive.
直觉常常是错的,要靠数据说话。
【陈硕】比如线程切换到底有多大开销,普通 mutex 加锁到底有多大代价,系统调用的开销如何,gettimeofday() 在 x86-64 Linux
是不是真的系统调用等等,都要靠数据说话。
3. Know when—and when not—to break up a lock.
知道什么时候把一个锁拆成多个,并知道什么时候不必这样做。
除了把全局锁拆成多个锁,另外一种常用的避免线程争用 (contention) 的办法是减少加锁的范围。比方说从共享的数据结构里移除(remove and
delete)元素,其实 delete 这一步可以放到锁外面。
4. Be wary of readers/writer locks.
警惕读写锁。
初学者常犯的一个错误是,见到某个数据结构频繁读而很少写,那么就把 mutex 替换为 rwlock。这不见得是正确的。
【陈硕】这条深得我心,muduo thread lib
目前就没有提供读写锁的封装。另外,这一条也能鉴别另一篇关于线程争用的文章
不靠谱。
5. Consider per-CPU locking.
考虑用每个 CPU 用一个锁。
6. Know when to broadcast—and when to signal.
知道什么时候用单个唤醒,什么时候用广播唤醒。
notifyAll() 通常表示状态变更,而 notify() 通常表示资源变得可用。滥用 notifyAll() 会导致惊群现象
。
【陈硕】 muduo thread lib 的 ThreadPool 区分使用 notify() 和 notifyAll(),可作参考。
7. Learn to debug postmortem.
学会验尸。
【陈硕】 在程序中只使用 Scoped locking 来加锁的话,很容易从 call stack 查出死锁。参考《多线程服务器的常用编程模型》
第 6 节 线程间同步。
8. Design your systems to be composable.
设计系统,使之能扩充。
【陈硕】 比方说,把对对象的修改操作都挪到同一个线程,这样就不必加锁。参考 muduo
的 EventLoop::runInLoop()。
9. Don’t use a semaphore where a mutex would suffice.
如果
Mutex 就能解决问题的话,不要使用信号量 semaphore。
【陈硕】muduo thread lib 有意识地不提供信号量的封装。
10. Consider memory retiring to implement per-chain hash-table
locks.
考虑用内存“退休”法来实现哈希表的按桶加锁。
11. Be aware of false sharing.
知道什么是伪共享。
跟多 CPU 的 Cache 有关,值得了解。
12. Consider using nonblocking synchronization routines to monitor
contention.
考虑使用非阻塞的加锁来观察线程争用。
13. When reacquiring locks, consider using generation counts to
detect state change.
在重新加锁时,考虑使用版本号来检测状态变更。
14. Use wait- and lock-free structures only if you absolutely must.
只在别无它法时才使用无锁数据结构。
15. Prepare for the thrill of victory—and the agony of
defeat.
准备接受成功的喜悦和失败的痛苦。
中文转自: 陈硕的 Blog
分享到:
相关推荐
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...
直接就放在书上,你丫有没有良知,书籍是什么,是希望,是神圣的,你们这些译者简直就是在犯罪 ,不过要是英文功底不好,还是建议买本看吧,谁让你英文水平不如他们呢 《JAVA并发编程实践》随着多核处理器的普及,...
为了帮助开发者避免常见的并发陷阱,《Java并发编程实战》还提供了一系列的最佳实践建议,比如: - **正确使用同步机制**:强调了在使用`synchronized`关键字或`ReentrantLock`时需要注意的问题。 - **异常处理**:...
本书名为《Java 并发编程实战》,主要针对Java开发者,在内容上深入探讨了Java语言中的线程和并发编程机制。...学习并发编程不仅需要理论知识,还需要丰富的实践经验,因此建议读者结合实际编码来巩固学习到的内容。
《Java并发编程艺术》这本书是Java开发者深入理解多线程编程的重要参考资料。它全面而深入地探讨了Java平台上的并发编程技术,对于提升程序性能、优化系统资源利用以及解决多线程环境中的复杂问题有着极大的帮助。...
### Java并发编程的艺术 #### 一、并发编程的挑战与应对策略 本书开篇即指出,随着现代计算机系统越来越依赖于多核处理器的并行计算能力,Java开发人员面临着前所未有的并发编程挑战。这些挑战包括但不限于数据...
Java并发编程的艺术 作者:方腾飞 魏鹏 程晓明 著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何...
### Java并发编程实践 #### 书籍概述 《Java并发编程实践》是一本由Brian Goetz等人编写的关于Java并发编程的经典著作。本书深入浅出地介绍了Java 5.0及之后版本中新增加的并发特性,并对并发编程进行了全面而详尽...
### Java虚拟机并发编程知识点概览 #### 一、并发编程的重要性与挑战 - **并发编程定义**:并发编程是指程序设计中允许多个计算任务同时进行的技术。在现代多核处理器环境中,通过并发编程可以充分利用硬件资源,...
### 并发编程的艺术 #### 一、引言与背景 《并发编程的艺术》是由方腾飞、魏鹏和程晓明三位作者合作编写的,旨在深入解析Java并发编程的各个方面,帮助开发者更好地理解和掌握并发编程的核心技术和实战技巧。本书...
### iOS并发编程指南 #### 1. 简介 在iOS开发中,为了提高应用程序的性能和响应能力,开发者需要充分利用多核处理器的优势来执行并行任务。本指南主要探讨了两种常用的并发机制——Grand Central Dispatch (GCD) ...
《JAVA并发编程实践》这本书是Java并发编程领域的经典之作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes和Doug Lea合著,旨在帮助Java开发者理解和掌握多线程环境下的编程技巧。...
《Java虚拟机并发编程》一书是...书中所包含的丰富内容和专家级别的建议,使得它成为JVM并发编程领域的一部重要作品。对于那些希望在多线程环境下设计出高效、稳定应用程序的开发者来说,这本书无疑是极佳的学习资源。
并发编程的艺术作为一本探讨Java并发技术的书籍,通过深入剖析Java并发框架、线程池的实现原理以及JVM和CPU层面的相关知识,旨在帮助读者深入理解并发编程技术,并掌握如何在实际应用中解决并发编程所带来的挑战。...
9. **并发编程最佳实践**:作者提供了许多实用的建议,如避免过度同步、最小化锁的粒度、使用并发工具而不是直接使用synchronized等,以提高并发程序的效率和可维护性。 10. **Java内存模型**:Java内存模型(JMM)...