Golang学习日志 ━━ atomic明明是原子操作,并发结果却出错

原子操作是硬件的底层支持,而锁是操作系统提供的API实现。
今天写原子操作时自以为锁得非常牢固,结果还是高估了自己~~话不多说,看代码

var atomicSW sync.WaitGroup
var atomicX int64 = 0
for 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并发时~~~一看就是小白的操作啊

============================================
并发时要时刻提醒自己不要被串行思路干扰

发布了44 篇原创文章 · 获赞 1 · 访问量 3595

猜你喜欢

转载自blog.csdn.net/snans/article/details/104354948