什么是 golang 中的同步(sync.RWMutex)

what is sync (sync.RWMutex) in golang

我正在寻找源代码的大猩猩上下文。我不明白它究竟同步了什么,mutex.Lock,mutex.Unlock。当我从源代码中删除 mutex.Lock 和 Mutex.Unlock 时,它仍然是 运行。

import (
    "net/http"
    "sync"
    "time"
)

var (
    mutex sync.RWMutex
    data  = make(map[*http.Request]map[interface{}]interface{})
    datat = make(map[*http.Request]int64)
)

// Set stores a value for a given key in a given request.
func Set(r *http.Request, key, val interface{}) {
    mutex.Lock()
    if data[r] == nil {
        data[r] = make(map[interface{}]interface{})
        datat[r] = time.Now().Unix()
    }
    data[r][key] = val
    mutex.Unlock()
}

Gorrila 的上下文通过映射将数据结构相互关联,但是 maps are not safe for concurrent use in go.

为了允许多个 goroutine 安全地访问同一个地图,互斥锁用于确保在任何给定时间只有一个 goro 具有对地图的写入权限。

但是,自 maps are safe for concurrent reads in go 以来,RWMutex 允许共享并发访问以通过拆分两个访问角色来读取地图外的数据,因此在任何时间点都没有锁柜,只有一个写锁柜,或者当前持有互斥量的一个或多个读锁柜。