前言 1
第1章 并发概述 9
摩尔定律,Web Scale和我们所陷入的混乱 10
为什么并发很难? 12
竞争条件 13
原子性 15
内存访问同步 17
死锁、活锁和饥饿 20
确定并发安全 28
面对复杂性的简单性 31
第2章 对你的代码建模:通信顺序进程 33
并发与并行的区别 33
什么是CSP 37
如何帮助你 40
Go语言的并发哲学 43
第3章 Go语言并发组件 47
goroutine 47
sync包 58
WaitGroup 58
互斥锁和读写锁 60
cond 64
once 69
池 71
channel 76
select语句 92
GOMAXPROCS控制 97
小结 98
第4章 Go语言的并发模式 99
约束 99
for-select循环 103
防止goroutine泄漏 104
or-channel 109
错误处理 112
pipeline 116
构建pipeline的最佳实践 120
一些便利的生成器 126
扇入,扇出 132
or-done-channel 137
tee-channel 139
桥接channel模式 140
队列排队 143
context包 151
小结 168
第5章 大规模并发 169
异常传递 169
超时和取消 178
心跳 184
复制请求 197
速率限制 199
治愈异常的goroutine 215
小结 222
第6章 goroutine和Go语言运行时 223
工作窃取 223
窃取任务还是续体 231
向开发人员展示所有这些信息 240
尾声 240
附录A 241