第九章 使用共享变量实现并发
< P262 >
- 可以用容量为1的
channel
实现互斥锁; - 通常互斥锁的声明紧贴在要守卫的变量前,如果偏离这个原则,应该在文档中说明;
- 如果返回的变量需要互斥锁,可以使用
defer
解锁;
< P266 >
sync.RWMutex
只有在多数是读取的情况下才更有效,因为RWMutex
的实现要求更多内部标记,当用作非争用锁时可能比常规的更慢;- 只读的变量也应该互斥;第一是防止在其它操作的中间步骤读取,第二是防止多核情况下,处理器没有将cache提交到主内存;
< P271 >
在go build
和go test
后加上选项-race
可以检测运行中出现的data race;
< P280 >
- goroutine的栈可以增长,一般初始大小是2KB;
- Go使用m:n scheduling,m指
goroutine
数,n指系统线程数; - goroutine在
time.Sleep
或channel
阻塞或互斥锁时会被scheduler置入休眠态,即不占用系统线程,但是如果是IO阻塞或者调用非Go函数则占用且其线程数不纳入GOMAXPROCS
; - 环境变量
GOMAXPROCS
指m:n中的n,默认值是cpu数; - goroutine没有供编程人员使用的标识;