面试题答案
一键面试package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
myMap := make(map[int]int)
for i := 0; i < 10; i++ {
wg.Add(1)
go func(index int) {
defer wg.Done()
myMap[index] = index * index
}(i)
}
go func() {
wg.Wait()
for k, v := range myMap {
fmt.Printf("Key: %d, Value: %d\n", k, v)
}
}()
}
数据竞争情况
- 读写竞争:多个goroutine同时向
myMap
写入数据时,可能会出现数据竞争。比如goroutine 1和goroutine 2同时尝试向myMap
中写入不同键值对,可能导致写入操作互相干扰,最终结果可能不符合预期。 - 读与写竞争:在某个goroutine读取
myMap
中的数据时,另一个goroutine可能正在写入数据,这也会导致数据竞争。比如goroutine A正在读取myMap[1]
的值,而goroutine B此时正好在修改myMap[1]
的值,读取到的值可能是部分修改后的值,造成数据不一致。
Go语言原生的map在多线程操作时,没有内置的同步机制来保证数据一致性,所以会出现上述数据竞争情况。