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

posted @ 2017-09-08 17:14  行知散人  阅读(159)  评论(0编辑  收藏  举报