我想从并发线程向Golang映射添加新的键/值对。问题在于,如果地图中存在钥匙,我们就不会创建新的钥匙对。从多线程的角度来看,如何检查当前条件以及是否不存在键,请插入键-值。
有什么方法可以组织代码以在首次遇到安全添加密钥的事情?
主要问题是安全地初始化互斥锁
答案 0 :(得分:4)
有什么方法可以组织代码以在首次遇到安全添加密钥的事情?
不。您需要正确的同步。
答案 1 :(得分:1)
我建议结合sync.Map
来存储键值和sync.Once
到值内以执行一次性初始化。
这里是一个例子:
type Value struct {
init sync.Once
someValue string
}
func (v *Value) Init() {
v.init.Do(func() {
// This function will only be executed one time
v.someValue = "initialized"
})
}
func main() {
var m sync.Map
v1, _ := m.LoadOrStore("key", &Value{})
v1.(*Value).Init() // init function is called
v2, _ := m.LoadOrStore("key", &Value{})
v2.(*Value).Init() // init function is not called
}