千家信息网

sync.Once 多次调用一次执行的方法

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容介绍了"sync.Once 多次调用一次执行的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2025年01月31日sync.Once 多次调用一次执行的方法

本篇内容介绍了"sync.Once 多次调用一次执行的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

demo

package mainimport (        "fmt"        "sync")func main() {        var once sync.Once        onceFunc := func() {                fmt.Println("this func do once")        }        done := make(chan bool)        for i := 0; i < 10; i++ {                go func() {                        once.Do(onceFunc)                        done <- true                }()        }        for i := 0; i < 10; i++ {                <-done        }}

output

liqiongtao:test liqiongtao$ go run main.go this func do once

Once源码

// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package syncimport (        "sync/atomic")// Once is an object that will perform exactly one action.type Once struct {        m    Mutex        done uint32}// Do calls the function f if and only if Do is being called for the// first time for this instance of Once. In other words, given//         var once Once// if once.Do(f) is called multiple times, only the first call will invoke f,// even if f has a different value in each invocation. A new instance of// Once is required for each function to execute.//// Do is intended for initialization that must be run exactly once. Since f// is niladic, it may be necessary to use a function literal to capture the// arguments to a function to be invoked by Do://         config.once.Do(func() { config.init(filename) })//// Because no call to Do returns until the one call to f returns, if f causes// Do to be called, it will deadlock.//// If f panics, Do considers it to have returned; future calls of Do return// without calling f.//func (o *Once) Do(f func()) {        if atomic.LoadUint32(&o.done) == 1 {                return        }        // Slow-path.        o.m.Lock()        defer o.m.Unlock()        if o.done == 0 {                defer atomic.StoreUint32(&o.done, 1)                f()        }}

"sync.Once 多次调用一次执行的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

方法 内容 更多 知识 实用 学有所成 接下来 困境 实际 情况 文章 案例 源码 编带 网站 行业 过程 高质量 学习 有关 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库设计技术视频 上海万户网络技术怎么样 达梦数据库 字符串长度函数 杭州华胜网络技术有限公司 购买服务器需要考虑系统么 跨国数据库有哪些 易语言标签显示数组数据库 斯塔克网络技术有限公司 笔记本连接服务器屏幕显示不全 泰拉瑞亚1.3多人服务器手机版 店管家服务器奔溃 网络安全制度落实情况总结 微信 服务器忙 北仑手机游戏软件开发地址 高级数据库测试题 c#注册的代码不连接数据库 智慧科技智能产业互联网 电脑服务器运行失败该怎么处理 服务器终端查找ip地址 网站搭建软件开发商许可协议 手机软件开发的利与弊 天旗解说我的世界服务器 山东网络技术资费 网络安全要牢记教学设计 绿盟bs架构网络安全宣传周 国内的5g网络技术用的是哪家的 计算机网络技术参军 境界北京网络技术股份 多媒体数据库技术简写 nas和硬盘柜 代码服务器
0