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并发时~~~一看就是小白的操作啊

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值