go - 将标准Golang映射转换为Sync.Map以避免出现竞争情况

标签 go thread-safety mutex race-condition goroutine

我有以下代码行:

var a_map = make(map[string] []int)

我的部分代码利用a_map变量有时会引发以下错误:
fatal error: concurrent map read and map write

为了尝试创建一种更强大的解决方案(没有这种错误),我想使用sync.Map而不是通用映射。提供给此堆栈溢出question的唯一答案启发了我。但是,我不清楚这样做的正确语法。

我第一次尝试使用以下代码行:
var a_map = make(sync.Map[string] []int)

导致以下错误:
...syntax error: unexpected ], expecting expression

然后我尝试了:
 sync_map := new(sync.Map)
 var a_map = make(sync_map[string] []int)

导致相同的错误:
...syntax error: unexpected ], expecting expression

最佳答案

sync.Map 不是Go map,因此您不能将a_map["key"]语法与其一起使用。而是一个struct,其中包含提供常规 map 操作的方法。使用它的语法是:

var m sync.Map
m.Store("example", []int{1, 2, 3})
fmt.Println(m.Load("example")) // [1 2 3] true

-https://play.golang.org/p/7rbEG_x0mrC

根据并发源的不同,您可能需要对每个键下的[] int值进行类似的同步,而sync.Map不会为您提供同步。 sync.Map仅提供每个键的加载/存储同步。如果需要,请发表评论,我们会尽力帮助您。

关于go - 将标准Golang映射转换为Sync.Map以避免出现竞争情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59294816/

相关文章:

inheritance - 在 Go 中嵌入而不是继承

assembly - 虚拟机必须解释字节码还是可以直接解释虚拟机的程序集?

c++ - 自定义条件作用域互斥锁

go - 如何在 golang net/smtp.sendmail 中定义发件人姓名?

java - 以下代码线程安全吗?

java - SerializedSubject 是 RxJava 线程安全所必需的吗

java - BlockingQueue 的 drainTo() 方法的线程安全

memory-management - 自旋锁是内存分配器的好选择吗?

c# - 如何实现单机单实例应用?

go - 带有授权 header 的 307 重定向