您知道嗎,在并發(fā)環(huán)境中將映射變量鏈接更改為另一個(gè)是否安全?一個(gè)例子是在一個(gè) goroutine 中將 mapdata替換為新的 map,并在另一個(gè) goroutine 中從它們中讀取元素:import ( "fmt" "math/rand" "strconv" "testing" "time")func TestMap(t *testing.T) { s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) data := fill(r1.Intn(100)) timer := time.NewTimer(10 * time.Second) go func() { s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) for { select { case <-timer.C: return default: } p := r1.Intn(100) v := fill(p) data = v fmt.Println("_p=" + strconv.Itoa(p)) } }() for range []int{1, 2, 3, 4, 5, 6, 7, 8} { go func() { s1 := rand.NewSource(time.Now().UnixNano()) r1 := rand.New(s1) for { select { case <-timer.C: return default: } n := r1.Intn(100) s := strconv.Itoa(n) fmt.Println(data[s]) } }() } <-timer.C}func fill(postfix int) map[string][]string { m := make(map[string][]string) for i := 0; i < 100; i++ { s := strconv.Itoa(i) m[s] = []string{s + "_" + strconv.Itoa(postfix)} } return m}
2 回答

侃侃爾雅
TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
當(dāng)然,這并不安全。沒有任何變量(包括映射)對(duì)于并發(fā)讀寫是安全的。
您的一個(gè) goroutine 寫入data
,另一個(gè)讀取它。運(yùn)行測試go test -race
還會(huì)報(bào)告數(shù)據(jù)競爭:
testing.go:954: race detected during execution of test
您必須從多個(gè) goroutine 同步讀取和寫入data
變量。
- 2 回答
- 0 關(guān)注
- 146 瀏覽
添加回答
舉報(bào)
0/150
提交
取消