使用场合
在实际生产中,很多时候我们需要执行只有一次的操作(如单例模式)。在golang中,我们可以简单的使用sync.Once包来实现该操作。
使用方式如下:
package main
import "sync.Once"
var once sync.Once
func process_init(){
//statement
...
}
func process(){
once.Do(process_init)
...
}
func main(){
for {
process()
}
}
sync.Once源码说明
import (
"sync/atomic"
)
type Once struct {
//互斥锁
m Mutex
//执行标记
done uint32
}
func (o *Once) Do(f func()) {
//原子操作判断o.done是否为1,若为1,表示f已经执行过,直接返回
if atomic.LoadUint32(&o.done) == 1 {
return
}
//加锁,保证互斥访问
o.m.Lock()
defer o.m.Unlock()
//基o.done为0,表示f未执行,对o.done原子赋值,并且执行f函数
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
网友评论