golang中sync.Once的示例分析
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关golang中sync.Once的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。sync.once可以控制函数只能被调用一次,不
千家信息网最后更新 2026年11月03日golang中sync.Once的示例分析
这篇文章将为大家详细讲解有关golang中sync.Once的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
sync.once可以控制函数只能被调用一次,不能多次重复调用。
我们可以用下面的代码实现一个线程安全的单例模式
package singleton
import (
"fmt"
"sync"
)
type object struct {
name string
}
var once sync.Once
var obj *object //单例指针
//公开方法 外包调用
func Instance() *object {
once.Do(getObj)
return obj
}
func getObj() {
if obj == nil {
obj = new(object)
//可以做其他初始化事件
}
}
//单例测试
func (obj *object) Test() {
fmt.Println(obj.name)
}如果我们要自己实现这么一个功能如何做呢?
定义一个status变量用来描述是否已经执行过了
使用sync.Mutex 或者sync.Atomic实现线程安全的获取status状态, 根据状态判断是否执行特定的函数
然后看下sync.Once实际是如何实现的
// Once is an object that will perform exactly one action.
type Once struct {
m Mutex
done uint32
}
//使用了双层检查机制
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
//这里需要再次重新判断下,因为 atomic.LoadUint32取出状态值到 o.m.Lock() 之间是有可能存在其它gotoutine改变status的状态值的
if o.done == 0 {
f()
atomic.StoreUint32(&o.done, 1)
}
}也有网友写出了更简洁的代码,不知道官方为什么没有采用下面的实现方式。
type Once struct {
done int32
}
func (o *Once) Do(f func()) {
if atomic.LoadInt32(&o.done) == 1 {
return
}
// Slow-path.
if atomic.CompareAndSwapInt32(&o.done, 0, 1) {
f()
}
}关于"golang中sync.Once的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
状态
篇文章
示例
分析
安全
代码
函数
更多
状态值
线程
面的
不错
实用
简洁
之间
事件
内容
再次
功能
双层
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
高科技互联网
互联网和科技技术
科技互联网公司装修
互联网科技英文
互联网科技作文
友谊互联网络科技
国外互联网科技网站
北京三清互联网科技
互联网科技产品
厦门比较好的科技互联网公司
昊天互联网科技有限公司
语蝶互联网科技有限公司
国大互联网教育科技有限公司工作
互联网方面的科技前沿
半导体是互联网高科技吗
科技互联网行业投资研究
互联网科技企业商标注意事项
互联网科技手抄报图片
互联网科技收购价值
安徽九吞吴互联网科技有限公司
互联网金融科技
什么是科技互联网
科技服务与互联网
新华互联网科技2019
北京华百购互联网科技有限公司
注册互联网科技公司经营范围大全
中国互联网公司排名锤子科技
卓翼科技产业互联网合作
互联网科技股为什么大涨
互联网科技包装股份有限公司上市