Go maps 未能通过并发测试

Go maps fails the concurency test

当我运行以下代码时:

import (
"log"
"sync"
"testing"
"time"
)
func TestConcurrency(t *testing.T) {
var mutex sync.RWMutex
dictionary := make(map[interface{}]interface{})
go func() {
    var value interface{}
    for {
        go func() {
            mutex.Lock()
            dictionary["Key"] = ""
            mutex.Unlock()
        }()

        go func() {
            mutex.RLock()
            value = dictionary["Key"]
            mutex.RUnlock()
        }()

    }
    log.Println(value)
}()
}

使用:

go test -race fileName.go

结果是:

Found 1 data race(s)

我该如何解决这个问题?

我有很多并发写入和读取。

如果您查看竞争检测器显示的错误,您会看到它报告了 value = dictionary["Key"] 行上的并发写入,这意味着检测到的竞争是在 value 上,而不是 dictionary.

您正在同时访问 2 个变量,dictionaryvalue。您不能使用读锁来保护映射上的读取,并写入 value 变量。您要么需要第二个互斥锁,要么需要始终使用 mutex.Lock 来序列化对两个变量的访问。

此代码将正常工作:

    go func() {
        mutex.Lock()
        value = dictionary["Key"]
        mutex.Unlock()
    }()

它保护变量 value 免受并发写入。