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