MST

星途 面试题库

面试题:Go语言中如何简单测试Map在多线程下非线程安全

请描述在Go语言中,使用goroutine和sync包,如何编写一个简单的示例来验证Go语言原生Map在多线程操作时是非线程安全的。并指出在示例中可能出现的数据竞争情况。
18.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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)
        }
    }()
}

数据竞争情况

  1. 读写竞争:多个goroutine同时向myMap写入数据时,可能会出现数据竞争。比如goroutine 1和goroutine 2同时尝试向myMap中写入不同键值对,可能导致写入操作互相干扰,最终结果可能不符合预期。
  2. 读与写竞争:在某个goroutine读取myMap中的数据时,另一个goroutine可能正在写入数据,这也会导致数据竞争。比如goroutine A正在读取myMap[1]的值,而goroutine B此时正好在修改myMap[1]的值,读取到的值可能是部分修改后的值,造成数据不一致。

Go语言原生的map在多线程操作时,没有内置的同步机制来保证数据一致性,所以会出现上述数据竞争情况。