保证在 Go 程序运行期间的某段代码只会执行一次

func main() {
o := &sync.Once{}
for i := 0; i < 10; i++ {
o.Do(func() {
fmt.Println("only once")
})
}
} $ go run main.go
only once

结构体

type Once struct {
done uint32
m Mutex
}

接口

sync.Once.Do 是 sync.Once 结构体对外唯一暴露的方法,该方法会接收一个入参为空的函数:

如果传入的函数已经执行过,会直接返回;

如果传入的函数没有执行过,会调用 sync.Once.doSlow 执行传入的函数:

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()
}
}

最新文章

  1. jQuery网页版五子棋小游戏源码下载
  2. MongoDB过过瘾
  3. (jdbc)取得数据库自动生成的主键方法
  4. Give My Text Back
  5. char引发的血案
  6. 安卓 Input Events(输入事件)
  7. Delphi RxRichEdit高级操作
  8. 使用jQuery获取GridView的数据行的数量
  9. java单例模式(线程安全,效率高,双重推断)
  10. 如何在MyEclipse中配置jre的编译运行环境
  11. JDK1.8源码(一)——java.lang.Object类
  12. Python2 编码问题分析
  13. 剑指offer 07:斐波那契数列
  14. Bukkit插件编程中.yml配置文件的创建和读取
  15. mybatis-generator eclipse插件 使用方法
  16. Lambda的分类(语句Lambda和表达式Lambda)
  17. ffmpeg综合应用示例(三)——安卓手机摄像头编码
  18. 打造html右键菜单
  19. $timeout
  20. 【300】◀▶ IDL - ENVI API

热门文章

  1. Node.js 应用全链路追踪技术——全链路信息存储
  2. Hive删除分区名称中含有特殊字符
  3. c++ stl 详解 csp备考
  4. 用Redis实现延迟队列,我研究了两种方案,发现并不简单
  5. .net core 从(本地)服务器获取APK文件并解析APK信息
  6. C# 高德地图WebApi对接示例
  7. 【KAWAKO】DTLN-1Dconv的原理
  8. Spring注解补充(一)
  9. 跳板攻击之:SSH 隧道
  10. Android:Activity