golang中sync.Once的示例分析
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章将为大家详细讲解有关golang中sync.Once的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。sync.once可以控制函数只能被调用一次,不
千家信息网最后更新 2025年02月06日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安全错误
数据库的锁怎样保障安全
teredo 服务器
英雄联盟手游日服服务器炸了
本机当服务器
远程阿里云数据库好慢
网络安全有关的图片素材
广东拓斯达科技软件开发面试
orl 人脸数据库
swich注册服务器怎么钻
法律法规和软件开发规范
hana数据库怎么复制所有字段
战术小队进入服务器密码怎么弄
软件开发有哪些培训机构
服务器代理权
服务器cpu风扇
服务器安全检查软件
mui云端数据库
卡丁车直播服务器
德阳软件开发操作
网络安全手抄报怎样写字儿
山西软件开发价格品质保障
访问服务器共享文件
六里桥租房软件开发
如何检测服务器安全性
云计算服务器是虚拟
网络技术公司加油费怎么做账
通辽市网络安全应急管理中心
中国的5g网络技术
软件开发有哪些培训机构
网络安全包括哪些方法
登录服务器修改代码