首先,我们看一下这个代码
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