orc*_*man -1 multithreading thread-safety go
map
据说Go不是goroutine-safe
(见这里和这里)。我有兴趣找出在我忽略使用互斥锁/等保护对地图的访问的情况下会发生什么。
具体来说,是否会发生以下任何一种情况?
k1
, k2
, ...,的映射,当我请求(i != j)时kn
,并发问题会导致 get吗?map[ki]
map[kj]
panic
应用程序中的 a 吗?正如评论已经指出的那样,比赛很糟糕。与 Java 不同,Go 的保证非常弱,因此即使不执行包含竞争的代码,也允许具有任何竞争的程序具有未定义的行为。在 C 中,这称为“着火语义”。比赛的存在意味着任何结果都是可能的,包括您的计算机着火。
然而,在 Go 中很容易使地图线程安全。考虑以下:
// Global variable defining a map
var safemap = struct {
sync.RWMutex
m map[string]string
}{m: make(map[string]string)}
Run Code Online (Sandbox Code Playgroud)
您可以像这样从地图中安全读取:
// Get a read lock, then read from the map
safemap.RLock()
defer safemap.RUnlock()
return safemap.m[mykey] == myval
Run Code Online (Sandbox Code Playgroud)
你可以像这样进行安全的修改:
// Delete from the map
safemap.Lock()
delete(safemap.m, mykey)
safemap.Unlock()
Run Code Online (Sandbox Code Playgroud)
或这个:
// Insert into the map
safemap.Lock()
safemap.m[mykey] = myval
safemap.Unlock()
Run Code Online (Sandbox Code Playgroud)