golang中sync.Once的示例分析
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章将为大家详细讲解有关golang中sync.Once的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。sync.once可以控制函数只能被调用一次,不
千家信息网最后更新 2025年12月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安全错误
数据库的锁怎样保障安全
字节跳动to b服务器
武林外传有几个服务器日服
软件开发的3千组装机推荐
台州高清视频系统服务器
济南信息工程学校软件开发
计算机网络技术专业年薪
深圳工业软件开发费用
数据库名和实例名
腾讯云端服务器工资
最准的时间服务器
数据库只有7个表的blog系统
怀柔区品牌软件开发程序
plc的重量写入数据库
数据库服务器查询格式化显示
服务器进入管理看运行状态
plsel连接远程数据库
校园食堂软件开发价格
apt网络安全防护
宗庆后问杨元庆服务器
网络安全零报告表格
远程管理服务器安卓
目前主流的web服务器有
网络安全方面招聘套路
ano数据库
支付宝服务器丢失
超级账本数据库备份
网易版有什么著名服务器
辽宁电脑软件开发价格
杭州首淘网络技术有限公司
浪潮发布国产飞腾cpu服务器