防止並發映射寫入崩潰
當嘗試從多個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中文網其他相關文章!