这种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设置为不同的值?
必须让Get()成为这样的东西吗?:
func (i *item) Get() int {
i.mutex.RLock()
defer i.mutex.RUnlock()
val := i.val
return val
}
答案 0 :(得分:4)
您的代码是安全的,在评估return
语句的表达式列表后执行延迟函数。如果你有named result parameters,那么在调用延迟函数之前也会为它们分配返回值(你甚至可以在从封闭函数返回“真正”之前修改返回值)。
无需创建存储i.val
的本地变量。