首先严重推荐《Go 并发编程实战》,对Go的并发模型讲的很透彻。

Goroutine是如何工作的 :

WaitGroup: (相当于C++ 同步中 栅栏的概念)

条件变量 :(和C 线程的 wait 类似)

(sync.Cond 方法Wait :会自动对与该条件变量关联的那个锁进行解锁,并且调用方所在的Goroutine被阻塞。一旦Wait方法受到通知,会试图再次加锁,如果加锁成功,则唤醒那个被阻塞的Goroutine 。否则,Wait 方法等待下一个通知。)

锁的使用: (golang 读写锁)

http://www.tuicool.com/articles/322qE3v