admin 发表于 2021-12-17 23:44:57

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]
查看完整版本: golang:使用sync.Once保证指定操作只会执行一次