sync.Once分析

2017-11-22  本文已影响0人  剑雪封侯之

使用场合

在实际生产中,很多时候我们需要执行只有一次的操作(如单例模式)。在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()
    }
}

上一篇 下一篇

猜你喜欢

热点阅读