我有一段代码,它对对象的初始化进行了双重检查锁定。
func checkSyncProducer() {
mutex.RLock()
if syncProducer == nil {
mutex.RUnlock()
mutex.Lock()
defer mutex.Unlock()
if syncProducer == nil {
syncProducer = createSyncKafkaProducer() //this func will initialize syncProducer.
}
} else {
defer mutex.RUnlock()
}
}
这段代码在mutex.RLock()第一次 nil 检查之前。
为什么需要这样?(它在页面中有解释,但我无法理解)并且它不会增加开销,因为每次调用 checkSyncProducer 时都会获取和释放读取锁。
在获取读锁之前是否应该再进行一次 nil 检查,例如:
func checkSyncProducer() {
if syncProducer == nil {
mutex.RLock()
if syncProducer == nil {
mutex.RUnlock()
mutex.Lock()
defer mutex.Unlock()
if syncProducer == nil {
createSyncKafkaProducer()
}
} else {
defer mutex.RUnlock()
}
}
}
第一个 nil 检查将确保 RLock 不会被不必要地占用。我对么?
慕标5832272
慕莱坞森
相关分类