Golang标准库中的sync.Once
是一个线程安全的用于执行一次性操作的对象。对于同一个sync.Once
对象,在第一次执行其Do
方法时将调用该方法的参数函数,而完成后再次调用Do
方法也不会再执行该参数函数。
例如下列实例中,将在循环中新建一个goroutine
并调用once.Do
方法,并将会打印Only once
文本的onceBody
方法作为参数传递至once.Do
方法中。随后通过channel
确保所有goroutine
都执行完成:
package main
import (
"fmt"
"sync"
)
func main() {
var once sync.Once
onceBody := func() {
fmt.Println("Only once")
}
done := make(chan bool)
for i := 0; i < 10; i++ {
go func() {
once.Do