golang:使用sync.Once保证指定操作只会执行一次
■实例说明有时候,我们需要某项任务只执行一次,但如果是在多协程环境中,自己控制则不太好操作,这个时候我们可以使用sync.Once来执行相关操作
1)使用sync.Once保证指定操作只会执行一次
2)即使是在多协程环境中,也保证执行一次
3)once控制的是自己,所以如果once执行过一次了,计算下次换个函数执行,这个新函数也一次不会执行,因为once执行过了
4)once执行方法无参数,无返回值,可以通过闭包的方式传递参数和返回值
■实例代码
package main
import (
"fmt"
"sync"
)
func main() {
// 定义两个once,可以控制两个方法只执行一次
// 也就是说,一个once,控制的是自己只执行一次,不管里面有多少个方法
var once1 sync.Once
var once2 sync.Once
hello := "hello world"
result := ""
// 虽然在循环中,但下面方法,只执行一次
for i := 0; i < 10; i++ {
// once.Do中执行方法要求无参数和返回值
// 我们可以使用闭包的方式传递参数和返回值
once1.Do(func() {
// 通过闭包,使用外面参数
fmt.Println(hello)
result = "你好,中国"
})
}
fmt.Println(result)
// 输出:你好,中国
//
for i := 0; i < 10; i++ {
// 注意:这里使用的是once1,因为上面once1已经执行过一次了,虽然这里执行的匿名方法变了,但因为once控制的是自己,
// 所以,这里的方法不会执行
once1.Do(func() {
fmt.Println("hello world 1")
})
// 多协程环境中,也可以保证once中执行的方法只会执行一次
go func() {
once2.Do(func() {
fmt.Println("hello world 2")
})
}()
}
}
// 最终输出
// hello world
// 你好,中国
// hello world 2
页:
[1]