Golang 并发原语 Sync Once

Once 保证操作只执行一次

  • 适用于一些单例、配置的加载等

内部数据结构

go 复制代码
type Once struct {
    done atomic.Uint32
    m    Mutex
}
  • done 用于标识操作是否已经完成只有01
  • m 互斥锁

核心方法

  • Do

    scss 复制代码
    func (o *Once) Do(f func()) {
        if o.done.Load() == 0 {
           o.doSlow(f)
        }
    }
    func (o *Once) doSlow(f func()) {
        o.m.Lock()
        defer o.m.Unlock()
        if o.done.Load() == 0 {
           defer o.done.Store(1)
           f()
        }
    }
  • 原子加载done值是否为0

  • 如果等于0说明f func()并没有被初始化

  • 进入doSlow方法

  • 加锁,然后再次原子加载done值是否为0。这里进行可一个double check,确保当前done的值没有被修改

  • 执行f func(),然后将done标记为1

once这个并发原底层代码非常简洁,也很好理解。

相关推荐
司南-704916 分钟前
Dense结构下的 大模型系统架构研究
服务器·人工智能·后端
GISer_Jing16 分钟前
AI全栈转型_TS后端学习路线
前端·人工智能·后端·学习
薪火铺子18 分钟前
Spring Security 6.x 实战指南
java·后端·spring
全栈小刘22 分钟前
Claude Code 为什么这么顺?Anthropic 最新复盘:真正撑住它的不是模型,而是缓存
后端
BING_Algorithm28 分钟前
一文搞定 AOP 所有核心知识点
spring boot·后端·spring
Cyan_RA942 分钟前
SpringMVC 请求数据绑定与参数映射 详解
java·后端·spring·mvc·springmvc·映射请求数据
GISer_Jing1 小时前
AI全栈工程师知识体系全景:从前后端核心架构到落地项目全拆解
前端·人工智能·后端·ai编程
longxibo1 小时前
【Flowable 7.2 源码深度解析与实战-前言】
java·后端·流程图
全栈小刘1 小时前
ChatGPT账号打通OpenClaw?Codex又整了个“电子宠物”,开发者这下真坐不住了
后端
日火1 小时前
Go:实现基于mutex的环形缓冲区
go