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这个并发原底层代码非常简洁,也很好理解。

相关推荐
未秃头的程序猿3 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
Darren2453 小时前
MySQL索引执行计划不走索引下推
后端
程序员清风3 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试
码事漫谈3 小时前
人机协同的三重范式:HITL、HOTL与HOOTL
后端
武子康3 小时前
Inkling 975B 说明“开放权重“与“普通开发者本地运行“已经分离,内容重点应是部署容量和运行时边界
前端·人工智能·后端
神奇小汤圆4 小时前
Spring Boot请求处理组件对比详解
后端
颜酱4 小时前
03 | 实现节点1 — 抽取关键词
前端·人工智能·后端
qq_452396234 小时前
第五篇:《接口与错误处理:Go 的哲学》
开发语言·后端·golang
神奇小汤圆4 小时前
SpringBoot + 虚拟线程,简直鸟枪换大炮~
后端
掘金一周5 小时前
想问问掘友们:AI 时代,资深开发的核心价值到底在哪里?| 沸点周刊 7.23
前端·人工智能·后端