线程安全,数据竞争

84 篇文章 3 订阅

首先,我们看一下这个代码

var l sync.WaitGroup
var t = make([]int , 0)
func main () {
	go ap()
	go ap()
	l.Add(2)
	l.Wait()
	fmt.Println(len(t))
}
func ap() {
	for i := 0 ; i <5000 ; i ++ {
		t = append(t , i)
	}
	l.Done()
}

问,输出的是什么?
//如果按照目标来说,应该输出10000,但是并不是,你会发现,每次输出的数字基本是不相同的。
答案说不确定,还是之前的错误,数据竞争导致数据丢失。
因为切片中进行添加数据时,首先判断切片的空的位置,再进行添加,但是多线程下,同时判断空位置后,进行插入数据,会导致数据竞争,导致数据丢失,解决方法,加入锁

var lo sync.Mutex
var l sync.WaitGroup
var t = make([]int , 0)
func main () {
	go ap()
	go ap()
	l.Add(2)
	l.Wait()
	fmt.Println(len(t))
}
func ap() {
	for i := 0 ; i <5000 ; i ++ {
		lo.Lock()
		t = append(t , i)
		lo.Unlock()
	}
	l.Done()
}

每次进行公共内存写入的时候,先将内存进行锁住,不能让其他进程访问,再写,写完之后再解锁,此时得到预期结果,10000

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值