首页 > 编程语言 >go sync.Once源码分析

go sync.Once源码分析

时间:2023-01-21 17:55:45浏览次数:57  
标签:goroutine sync 源码 done atomic func go Once

适用场景

服务启动时读取全局配置。
单个函数流程里面只调用一次。

源码

双重检查done值是0后,加锁执行指定函数并把done值改成1。

type Once struct {
	done uint32
	m    Mutex
}

func (o *Once) Do(f func()) {
	if atomic.LoadUint32(&o.done) == 0 {
		o.doSlow(f)
	}
}

func (o *Once) doSlow(f func()) {
	o.m.Lock()
	defer o.m.Unlock()
        // 双重检查
	if o.done == 0 {
		defer atomic.StoreUint32(&o.done, 1)
		f()
	}
}

源码使用Mutex的原因

package main

import "sync/atomic"

type Once struct {
	done uint32
}

func (o *Once) Do(f func()) {
	if !atomic.CompareAndSwapUint32(&o.done, 0, 1) {
		return
	}
	f()
}

相比于源码,直接使用cas的问题是,第1个goroutine在成功执行cas后没有执行完指定函数,其他goroutine因cas失败而返回后,使用未初始化的资源时可能会panic。
第1个goroutine结束前,阻塞住其他goroutine,确保所有goroutine可以正常访问资源。

标签:goroutine,sync,源码,done,atomic,func,go,Once
From: https://www.cnblogs.com/WJQ2017/p/17063945.html

相关文章

  • GO语言之环境搭建和基本命令
    目录go语言基础下载go编译器go目录简介gopath简介环境变量配置GOPATHPATHgo语言项目结构IDE下载与配置安装golandgoland里添加goroot和gopath编写第一个GO程序编译go文件在......
  • 一文学会 Go 的三个主流开发框架
    一文学会Go的三个主流开发框架前言本文介绍了三个Go主流开发框架GORM,Kitex,Hertz的基本使用方法,覆盖了ORM,RPC,HTTP三个领域。帮助读者快速入门Go工程开发。GORM......
  • alpha shape algorithm
    一个求轮廓的算法analphavalue(0<α<∞)isaparameterimposingtheprecisionofthefinalboundary.Alargevalue(α->∞)resultsinthealphaboundaryo......
  • async/await
    一、对async/await的理解async函数执行会返回一个Promise对象,如果在函数中return一个直接量,async会把这个直接量通过Promise.resolve()封装成Promise对象。......
  • (17)go-micro微服务Prometheus监控
    目录一Prometheus监控介绍1.微服务监控系统promethues介绍2.微服务监控系统promethues工作流程二Prometheus监控重要组件和重要概念1.微服务监控系统promethues重要组件2......
  • golang字典生成算法实现(全排列实现)
    packagemain//@Title main.go//@Description 入口文件//@Author xiao//@Update noneimport( "flag" "fmt" "log")//字典常量const( lowerCaseChar......
  • MongoDB cmd CRUD操作 对照SQL
    问题​​参考官方文档​​使用MogoDB你就要熟悉他的常用cmd命令,增删改查,聚合多表查询等基本操作,本片博客旨在教会大家快速上手MogoDB,对其有基本了解,会对照Oracle的SQL查询......
  • Google 的新玩法 Fact Check
    美国总统大选期间,希拉里和川普在一本正经胡说八道的同时,媒体们和吃瓜群众也在忙着用factcheck(事实查证)给政客们打脸。昨天,Google奉献神助攻,他们给GoogleNews增加......
  • GoodBye Renyin ABC题解
    GoodByeRenyinABC题解A答案为\(\text{YES}\)的充要条件是\(\max(a_i)\timesr\le(\suma_i-\max(a_i))\timesR\)。必要性显然。充分性是可以先把最大的放在\((......
  • polygon部署 mainnet 0.3.x
    环境要求内存:16-32GBCPU:4-8核CPU(t3xLarge)存储:至少650GBSSD(确保它是可扩展的)安装环境依赖安装编译环境~#sudoapt-getinstallbuild-essential-y安装go~#......