赞
踩
在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次,例如只加载一次配置文件、只关闭一次通道等。
Go语言中的sync包中提供了一个针对只执行一次场景的解决方案–sync.Once。
sync.Once只有一个Do方法,其定义如下:
func (o *Once) Do(f func()) {}
注意:如果要执行的函数f需要传递参数就需要搭配闭包来使用。
每一个sync.Once结构体中都只包含一个用于标识代码块是否执行过的done标记以及一个互斥锁 Mutex:
- type Once struct {
- done uint32
- m Mutex
- }
并且这个结构体只提供两个方法:
- func (o *Once) Do(f func()) {
- // Note: Here is an incorrect implementation of Do:
- //
- // if atomic.CompareAndSwapUint32(&o.done, 0, 1) {
- // f()
- // }
- //
- // Do guarantees that when it returns, f has finished.
- /
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。