【发布时间】:2021-02-23 12:48:57
【问题描述】:
有人告诉我memCacheInstance 有竞争条件,但go run -race 不知道。
代码:
type MemCache struct {
data []string
}
var memCacheInstance *MemCache
var memCacheCreateMutex sync.Mutex
func GetMemCache() *MemCache {
if memCacheInstance == nil {
memCacheCreateMutex.Lock()
defer memCacheCreateMutex.Unlock()
if memCacheInstance == nil {
memCacheInstance = &MemCache{
data: make([]string, 0),
}
}
}
return memCacheInstance
}
【问题讨论】:
-
仅供参考,您所做的事情有一个名称:它称为“双重检查锁定”。在大多数计算机只有一个 CPU 内核的时代,这曾经是一种常见的模式,但当多核计算机出现时,它就变成了一种反模式。您可能会在较旧的教科书和/或程序中找到它的示例,但如果是这样,这些程序/教科书已经过时了。 (但是,当然你不会找到任何旧的
go程序!)
标签: go concurrency singleton data-race