[Golang]同步工具-sync包的Once-心智图总结

1. sync.Once的功用是什麽?
A. 只执行ㄧ次函数。
更具体说,需要执行函数的时候,呼叫sync.Once的Do方法,该方法就会执行函数,且只执行一次
B. sync.Once类型属於结构体类型,为开箱即用。此类型包含sync.Mutex的字段。

type Once struct {
	m    Mutex
	done uint32
}

C. 这个类型的Do方法,只接受一个参数,而这个参数的类型必须是func(),无参数和结果声明的函数。

2. Do方法的功能,并不是对每一种参数函数都只执行ㄧ次,而是只执行"第一次被调用传入"的函数,并且之後不会再执行任何参数函数。
如果,有多个只需要执行ㄧ次的函数,就必须为它们每一个都写一个sync.Once类型的值。

3. 程序码范例

package main

import (
  "fmt"
  "sync"
  "sync/atomic"
)

func main() {
  var counter uint32
  var once sync.Once
  once.Do(func() {
    atomic.AddUint32(&counter, 1)
  })
  fmt.Printf("The counter: %d\n", counter)

  once.Do(func() { // 没有执行。上面已经用过这个Once类型的变数,就不会再执行
    atomic.AddUint32(&counter, 2)
  })
  fmt.Printf("The counter: %d\n", counter)

  var once2 sync.Once // 想要再执行其它函数,就必须再写一个sync.Once类型的变数
  once2.Do(func() {
    atomic.AddUint32(&counter, 5)
  })
  fmt.Printf("The counter: %d\n", counter)
}

https://play.golang.org/p/P5jBkCzr1LB

https://ithelp.ithome.com.tw/upload/images/20201202/20131728oupFJlC9l8.png

参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


<<:  Gulp 基础介绍 DAY79

>>:  在Windows 10中更改Windows应用商店下载的位置

OpenStack Nova 介绍 2

本系列文章同步发布於笔者网站 上一篇文章我们介绍了 Nova 的功能与其使用方法,本篇文章将会继续介...

Sass @import DAY34

今天我们要来学习如何把Sass切分支许多档案 这样会使我们比较容易管理 @import(汇入) 可将...

day8_MacOs ARM 的文书工作之旅

Mac Book Arm 文书工作如何呢? Mac Book Arm 我个人觉得非常适合文书或业务使...

Day-2 我也...可以跟电脑娘说话吗

我也...可以跟电脑娘说话吗 tags: IT铁人 首篇不会给大家太多压力,简单介绍我们写出来的程序...

中阶魔法 - 执行环境与执行堆叠

前情提要 上回偷拿远距离初阶魔法攻击艾草。 艾草:「我看你拿魔法丢我丢得挺顺的了(╬•᷅д•᷄╬),...