教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang Once源码解析

Golang Once源码解析

发布时间:2021-04-18   编辑:jiaochengji.com
教程集为您提供Golang Once源码解析等资源,欢迎您收藏本站,我们将为您提供最新的Golang Once源码解析资源

sync.Once可以实现单例模式,确保sync.Once.Do(f func())只会被执行一次,可以初始化某个实例单例。

针对Golang 1.9的sync.Once,与Golang 1.10一样。 源代码位置:sync\once.go。

结构体

Once结构体定义如下:

type Once struct {
    m    Mutex
    done uint32   // 初始值为0表示还未执行过,1表示已经执行过
}

Do

func (o *Once) Do(f func()) {
    // done==1表示已经执行过了,直接结束返回
    if atomic.LoadUint32(&o.done) == 1 {
        return
    }
    // 锁住对象,避免并发问题
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        // 先将done设置为1,再执行f函数
        defer atomic.StoreUint32(&o.done, 1)
        f()
    }
}

需要注意的是执行f函数是同步进行的,也就是说可能存在阻塞问题。

转载于:https://blog.51cto.com/qiangmzsx/2106069

到此这篇关于“Golang Once源码解析”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang Once源码解析
Golang package sync 剖析(一): sync.Once
【Go】我与sync.Once的爱恨纠缠
为什么很多公司转型 Go 语言开发?Go 语言能做什么
jQuery源码分析系列(31) : Ajax deferred实现
Golang设计模式之单例模式
jQuery源码分析系列:Callback深入
Golang 源码剖析:fmt 标准库 --- Print* 是怎么样输出的?
Golang并发:除了channel,你还有其他选择
asp.net 析构函数详解与用法

[关闭]
~ ~