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