基于共享变量的并发
一、 竞争条件 多个 goroutine 并发访问同一变量时,如果存在对该变量的写操作。就会发生竞争。 go 的口头禅:不要使用共享数据来通信;使用通信来共享数据。
避免竞争方法 方法一、不要去写共享变量 方法二、避免从多个goroutine访问变量 方法三、使用互斥锁
二、 sync.Mutex互斥锁 二元信号量 一个只能为0和1信号量叫做二元信号量
var ( sema = make(chan struct{}, 1) // a binary semaphore guarding balance balance int ) func Deposit(amount int) { sema <- struct{}{} // acquire token balance = balance + amount <-sema // release token } func Balance() int { sema <- struct{}{} // acquire token b := balance <-sema // release token return b } sync 包中的 Mutex 类似二元信号量 import "sync" var ( mu sync.……