map据说Go的不是goroutine- safe(请参见此处和此处)。我有兴趣找出在我忽略使用互斥锁/ etc保护访问地图的情况下可能发生的情况。
map
goroutine- safe
具体来说 ,是否会发生以下任何情况?
k1
k2
kn
map[ki]``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)}
您可以像这样从地图上进行安全读取:
// 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()