返回

Go 语言的 sync.Once:代码演示如何实现单例模式

后端

前言

在 Go 语言中,sync.Once 是一个非常有用的并发编程工具,它可以确保某个函数只会被执行一次,即使在多个 goroutine 中也不会重复执行。这在很多场景下都非常有用,比如初始化全局变量、加载配置文件等。

原理

sync.Once 的原理非常简单,它内部维护了一个标志位 m.done,当这个标志位被设置为 true 时,Do 方法就会直接返回,而不会再执行函数 f

使用方法

使用 sync.Once 非常简单,只需要调用它的 Do 方法即可。Do 方法接收一个函数作为参数,这个函数只会被执行一次。

package main

import (
	"fmt"
	"sync"
)

var once sync.Once

func main() {
	once.Do(func() {
		fmt.Println("Hello, world!")
	})
}

输出:

Hello, world!

实现单例模式

sync.Once 可以很容易地用来实现单例模式。单例模式是一种设计模式,它可以确保某个类只有一个实例。在 Go 语言中,我们可以使用 sync.Once 来实现单例模式。

package main

import (
	"fmt"
	"sync"
)

type Singleton struct {
}

var (
	once     sync.Once
	instance *Singleton
)

func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{}
	})
	return instance
}

func main() {
	s1 := GetInstance()
	s2 := GetInstance()
	fmt.Println(s1 == s2) // true
}

输出:

true

总结

sync.Once 是一个非常有用的并发编程工具,它可以确保某个函数只会被执行一次,即使在多个 goroutine 中也不会重复执行。这在很多场景下都非常有用,比如初始化全局变量、加载配置文件等。

sync.Once 的原理非常简单,它内部维护了一个标志位 m.done,当这个标志位被设置为 true 时,Do 方法就会直接返回,而不会再执行函数 f

使用 sync.Once 非常简单,只需要调用它的 Do 方法即可。Do 方法接收一个函数作为参数,这个函数只会被执行一次。

sync.Once 可以很容易地用来实现单例模式。单例模式是一种设计模式,它可以确保某个类只有一个实例。在 Go 语言中,我们可以使用 sync.Once 来实现单例模式。