如何安全地将新的键值对添加到本地地图

时间:2019-10-29 14:50:06

标签: multithreading dictionary go thread-safety mutex

我想从并发线程向Golang映射添加新的键/值对。问题在于,如果地图中存在钥匙,我们就不会创建新的钥匙对。从多线程的角度来看,如何检查当前条件以及是否不存在键,请插入键-值。

有什么方法可以组织代码以在首次遇到安全添加密钥的事情?

主要问题是安全地初始化互斥锁

2 个答案:

答案 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
}