基础用法
import "sync"
...
var once sync.Once
...
once.Do(...something...)
...
sync.Once只有一个方法Do()
作用是,sync.Once类型的变量只会执行一次Do(),无论Do()里面是什么
场景
因为go是高并发语言,这样sync.Once就有个很好的作用,可以在全局单次的函数中使用。
一.延迟初始化
这个是网上最常用的,用于执行时的初始化操作,比如在调用函数时先进行一次初始化操作再进行执行。
举例:
package main
import (
"fmt"
"sync"
)
var once sync.Once
var testmap map[string] int32
// 对testmap进行初始化的函数
func loadTestmap() {
testmap = map[string] int32{
"k1": 1,
"k2": 2,
"k3": 3,
}
}
// 获取testmap对应key的值,如果没有初始化,会先执行初始化
// 书上说这个函数是并发安全的,这里的map初始化之后,内容不会再变
func getKey(key string) int32 {
once.Do(loadTestmap)
// 最后的return这句可能不是并发安全的,不过线程安全的map不是这里的重点
// 假定这里的map在初始化之后只会被多个goroutine读取,其内容不会再改变