防止并发映射写入崩溃
当尝试从多个 goroutine 并发写入同一个映射时,Go 1.6 会触发故意崩溃以防止数据损坏。与可以通过使用 defer 和 receive 恢复的恐慌不同,此崩溃是故意的且无法拦截。
要解决此问题,请避免并发写入映射。在提供的示例中:
package main import "time" var m = make(map[string]string) func main() { go func() { // Rewrite m["x"] = "foo" in a loop for { m["x"] = "foo" } }() go func() { // Rewrite m["x"] = "foo" in a loop for { m["x"] = "bar" } }() time.Sleep(1 * time.Second) // Keep the program running }
从多个 goroutine 并发写入映射违反了 Go 的映射并发规则,导致故意崩溃。
为了防止这种崩溃并强制数据完整性,考虑使用互斥锁或同步原语来控制对映射的访问。这确保一次只有一个 goroutine 可以修改映射。
以上是如何防止 Go 中并发 Map 写入崩溃?的详细内容。更多信息请关注PHP中文网其他相关文章!