美文网首页golang技巧篇
golang sync.Once应用场景

golang sync.Once应用场景

作者: _yun | 来源:发表于2022-12-06 15:59 被阅读0次
      1. chan只关闭一次
    type MyChan struct {
        c    chan int
        once sync.Once
    }
    
    func (m *MyChan) SafeClose() {
        m.once.Do(func() {
            close(m.c)
        })
    }
    
      1. 懒加载
    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计算, 提高效率

    相关文章

      网友评论

        本文标题:golang sync.Once应用场景

        本文链接:https://www.haomeiwen.com/subject/gxawfdtx.html