【发布时间】:2020-10-08 15:11:53
【问题描述】:
我在 Go 中有一个包含互斥锁的结构,我想确保该互斥锁永远不会是 nil。为此,我实现了一个GetMutex() 函数,它检查互斥锁是否为nil,如果是,则为其分配一个值。
我的问题是:以下代码线程安全吗?如果不是,那么确保mux 始终被初始化的惯用方法是什么?我唯一能想到的就是在我的GetMutex() 函数中使用这个包中的全局互斥锁,但也许有不同的方法。
package main
import (
"sync"
)
type Counter struct {
mux *sync.Mutex
counter int
}
// Is this thread safe?
func (c *Counter) GetMux() *sync.Mutex {
if c.mux == nil {
c.mux = &sync.Mutex{}
}
return c.mux
}
func (c *Counter) Inc() {
c.GetMux().Lock()
c.counter++
c.GetMux().Unlock()
}
func main() {
c := &Counter{}
c.Inc()
}
【问题讨论】:
标签: go struct concurrency mutex