这种Get方法是否有缺陷并容易出现理论数据竞争?
type item struct {
val int
mutex sync.RWMutex
}
func (i *item) Set(val int) {
i.mutex.Lock()
defer i.mutex.Unlock()
i.val = val
}
func (i *item) Get() int {
i.mutex.RLock()
defer i.mutex.RUnlock()
return i.val
}
我问,因为我在使用-race
和前代码运行我的测试时看到了罕见的数据竞争,但是找不到任何重复效果的方法。
是否可以在延迟执行RUnlock和从结构中读取并返回值之间将i.val设置为不同的值?
必须得到()这样的东西吗?:
func (i *item) Get() int {
i.mutex.RLock()
defer i.mutex.RUnlock()
val := i.val
return val
}
您的代码是安全的,在评估return
语句的表达式列表之后执行延迟函数。如果你有named result parameters,那么在调用延迟函数之前也会为它们分配返回值(你甚至可以在从“封闭函数”返回“真正”之前修改返回值)。
无需创建局部变量来存储i.val
。