go 基础
通常意义上的加锁,是对业务逻辑加锁,使业务变成一个原子的事务
如果仅仅对变量加锁,业务不是原子操作依然可能产生数据竞争
x := safeint.get()
x++
safeint.set(x)
以上代码虽然x是安全的,但是x++依然产生了竞争
哪怕你写成一句,safeint.set(safeint.get()+1),仍然需要加锁
同理,以下代码也有race
x:=<-ch
x++
ch <- x
所以channel,1.不能代替锁,2.对变量加锁,也不能保证业务逻辑没有竞争
https://github.com/mikeluwen/build-web-application-with-golang/blob/master/zh/02.2.md