据说Go的map不是goroutine-safe(请参阅herehere)。我有兴趣找出在我忽略使用互斥锁/ etc保护访问 map 的情况下可能发生的情况。

特别是,是否可能发生以下任何情况?

  • 假设我有一个包含键k1k2,...,kn的 map ,当我要求map[ki](i!= j)时,并发问题会导致获得map[kj]吗?
  • 它可以在应用程序中导致panic吗?
  • 最佳答案

    正如评论已经指出的那样,种族是不好的。与Java不同,Go具有非常弱的保证,因此,即使未执行包含种族的代码,具有任何种族的程序也可以具有未定义的行为。在C语言中,这称为“赶火语义”。种族的存在意味着任何结果都是可能的,包括计算机起火。

    但是,在Go中,使映射线程安全很容易。考虑以下:

    // Global variable defining a map
    var safemap = struct {
        sync.RWMutex
        m map[string]string
    }{m: make(map[string]string)}
    

    您可以像这样从 map 上进行安全读取:
    // Get a read lock, then read from the map
    safemap.RLock()
    defer safemap.RUnlock()
    return safemap.m[mykey] == myval
    

    您可以像这样进行安全的修改:
    // Delete from the map
    safemap.Lock()
    delete(safemap.m, mykey)
    safemap.Unlock()
    

    或这个:
    // Insert into the map
    safemap.Lock()
    safemap.m[mykey] = myval
    safemap.Unlock()
    

    关于multithreading - 在Go中使用映射时忽略goroutine/线程安全性的危险是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35431102/

    10-17 01:37