这个 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
}
Run Code Online (Sandbox Code Playgroud)
我问是因为我在-race使用以前的代码运行测试时看到了罕见的数据竞争,但找不到任何复制效果的方法。
在延迟执行 RUnlock 和我们从结构中读取和返回值之间,是否可以将 i.val 设置为不同的值?
Get() 必须是这样的吗?:
func (i *item) Get() int {
i.mutex.RLock()
defer i.mutex.RUnlock()
val := i.val
return val
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3651 次 |
| 最近记录: |