本文共 555 字,大约阅读时间需要 1 分钟。
原子操作是硬件的底层支持,而锁是操作系统提供的API实现。
今天写原子操作时自以为锁得非常牢固,结果还是高估了自己~~话不多说,看代码var atomicSW sync.WaitGroupvar atomicX int64 = 0for i := 0; i < 1000; i++ { atomicSW.Add(1) go func() { //如果使用这个方式来实现atomicX++结果或atomicX=atomicX+1结果,不仅多此一举,其结果更是错的 atomicX = atomic.AddInt64(&atomicX, 1) //应当使用如下方式 //atomic.AddInt64(&atomicX, 1) atomicSW.Done() }()}atomicSW.Wait()fmt.Println("结果为:", atomicX)//结果为995等各种可能性
原子操作后的返回值再赋值给atomicX,这个=号赋值的操作并没有加锁,效果等同于没有使用原子操作。
当遇到多个goroutine并发时~~~一看就是小白的操作啊============================================
并发时要时刻提醒自己不要被串行思路干扰转载地址:http://lvkpi.baihongyu.com/