golang sync.Once应用场景
2022-12-06 本文已影响0人
_yun
- chan只关闭一次
type MyChan struct {
c chan int
once sync.Once
}
func (m *MyChan) SafeClose() {
m.once.Do(func() {
close(m.c)
})
}
- 懒加载
type Person struct{}
var per *Person
var once sync.Once
func GetInstance() *Person {
once.Do(func() {
per = new(Person)
})
return per
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
p := GetInstance()
fmt.Printf("%p\n", p)
}()
}
wg.Wait()
}
总结:
type Once struct {
done uint32
m Mutex
}
sync.Once是一种单例模式, 并且保证 once.Do(f) 在返回时, f()一定已经被执行了, sync.Once源码中, 将高频访问的done字段放到第一位可减少cpu的offset计算, 提高效率