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

相关推荐
拂晓银砾19 小时前
数据库字段多类型Json值处理
java·后端
用户40993225021220 小时前
PostgreSQL处理SQL居然像做蛋糕?解析到执行的4步里藏着多少查询优化的小心机?
后端·ai编程·trae
代码匠心20 小时前
从零开始学Flink:数据输出的终极指南
java·大数据·后端·flink
IT_陈寒21 小时前
SpringBoot性能调优实战:5个让接口响应速度提升300%的关键配置
前端·人工智能·后端
xcLeigh21 小时前
Python操作国产金仓数据库(KingbaseES)全流程:搭建连接数据库的API接口
后端
whltaoin1 天前
Spring Boot 常用注解分类整理(含用法示例)
java·spring boot·后端·注解·开发技巧
唐叔在学习1 天前
【Git神技】三步搞定指定分支克隆,团队协作效率翻倍!
git·后端
咸菜一世1 天前
Scala的while语句循环
后端
嚴寒1 天前
Halo 博客系统部署配置
后端
不会算法的小灰1 天前
Spring Boot 实现邮件发送功能:整合 JavaMailSender 与 FreeMarker 模板
java·spring boot·后端