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

相关推荐
好好研究31 分钟前
SpringBoot整合SpringMVC
xml·java·spring boot·后端·mvc
曹轲恒35 分钟前
SpringBoot整合SpringMVC(末)
java·spring boot·后端
小马爱打代码37 分钟前
Spring Boot:邮件发送生产可落地方案
java·spring boot·后端
程序员泠零澪回家种桔子2 小时前
OpenManus开源自主规划智能体解析
人工智能·后端·算法
Remember_9932 小时前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
kiss strong2 小时前
springboot替换word模板&加入二维码&加水印&转为pdf
spring boot·后端·pdf
Stecurry_302 小时前
Springboot整合SpringMVC --从0到1
java·spring boot·后端
JaguarJack2 小时前
PHP 现在可以零成本构建原生 iOS 和 Android 应用 NativePHP for Mobile v3 发布
后端·php·laravel·服务端
啊汉12 小时前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
一点程序13 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统