struct并发赋值
type Test struct {
X int
Y int
}
func main() {
var g Test
for i := 0; i < 1000000; i++ {
var wg sync.WaitGroup
// 协程 1
wg.Add(1)
go func() {
defer wg.Done()
g = Test{1, 2}
}()
// 协程 2
wg.Add(1)
go func() {
defer wg.Done()
g = Test{3, 4}
}()
wg.Wait()
// 赋值异常判断
if !((g.X == 1 && g.Y == 2) || (g.X == 3 && g.Y == 4)) {
fmt.Printf("concurrent assignment error, i=%v g=%+v", i, g)
break
}
}
}
//多次调用,会出现concurrent assignment error, i=27004 g={X:3 Y:2}
结构体中有多个字段,此时struct赋值时,并不是原子操作,各个字段之间独立,在并发操作时可能会出现异常.
atomic.Value来保证并发赋值的安全性
func main() {
var s atomic.Value
for i := 0; i < 1000000; i++ {
var wg sync.WaitGroup
// 协程 1
wg.Add(1)
go func() {
defer wg.Done()
s.Store("ab")
}()
// 协程 2
wg.Add(1)
go func() {
defer wg.Done()
s.Store("abc")
}()
wg.Wait()
// 赋值异常判断
g := s.Load().(string) //类型断言
if g != "ab" && g != "abc" {
fmt.Printf("concurrent assignment error, i=%v s=%v", i, s)
break
}
}
}