放置同步.互斥锁在包级别变量对包级别映射有任何影响?



在下列函数之一中调用mu.Lock()会锁定包级accCache映射吗?

package cache
import (
"sync"
)
type CachedAccount struct {
Id       string
Expires  int64
}

var accCache = make(map[string]CachedAccount)
var mu sync.Mutex

func addAccount...
func getAccount...

在类型为sync.Mutex的变量上调用Lock,除了确保在同一变量上调用Lock的任何其他运行例程将暂停其执行,直到其他运行例程在同一变量上调用Unlock

也就是说,您的思路是错误的:互斥锁本身并不保护任何程序状态。相反,它只是一种显式序列化访问程序状态某些部分的方法。
这些部分是由访问它们的代码决定的,所有这些代码都应该使用某种一致同意的机制来序列化这些访问(它可以是互斥锁或其他东西)。

正因为如此,在代码中引入数据竞争是可能的:如果不是所有访问程序状态的相同部分的代码路径都使用相同的同步机制,则存在数据竞争条件。