golang技巧篇

golang sync.Once应用场景

2022-12-06  本文已影响0人  _yun
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计算, 提高效率

上一篇下一篇

猜你喜欢

热点阅读