0

0

如何使用Golang实现单例模式线程安全_确保并发环境下唯一实例

P粉602998670

P粉602998670

发布时间:2025-12-24 19:44:48

|

871人浏览过

|

来源于php中文网

原创

推荐使用 sync.Once 实现线程安全单例,它保证初始化函数仅执行一次且并发安全;避免双重检查锁,因 Go 内存模型不支持 volatile 且 sync.Once 更可靠高效;支持懒汉式与饿汉式两种方式。

如何使用golang实现单例模式线程安全_确保并发环境下唯一实例

在 Go 语言中实现线程安全的单例模式,核心是避免多次初始化、防止竞态,并兼顾性能与简洁性。推荐使用 sync.Once —— 它天然保证函数只执行一次,且并发安全,无需手动加锁。

用 sync.Once 实现懒汉式线程安全单例

sync.Once 是 Go 标准库提供的轻量级同步原语,适合单次初始化场景。它内部已做充分优化,比手写互斥锁更高效、更可靠。

  • 定义一个私有全局变量(如 instance *Singleton)和一个 sync.Once 实例
  • 提供公有获取方法(如 GetInstance()),内部调用 once.Do() 包裹初始化逻辑
  • 初始化函数只会在第一次调用时执行,后续调用直接返回已创建的实例

示例代码:

package singleton

import "sync"

type Singleton struct {
    // 可添加字段,如配置、连接池等
}

var (
    instance *Singleton
    once     sync.Once
)

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
        // 此处可加入耗时初始化操作(如加载配置、建立数据库连接)
    })
    return instance
}

避免常见陷阱:不要用双重检查锁(Double-Check Locking)

有些开发者尝试模仿 Java 的 DCL 写法(先判空 → 加锁 → 再判空),但在 Go 中既不必要也不推荐:

立即学习go语言免费学习笔记(深入)”;

Vozo
Vozo

Vozo是一款强大的AI视频编辑工具,可以帮助用户轻松重写、配音和编辑视频。

下载
  • Go 的内存模型不保证普通变量读写的重排序行为完全可控,DCL 需要 volatile 或显式屏障,而 Go 没有 volatile
  • sync.Once 已由标准库严格验证,正确处理了内存可见性和执行顺序
  • DCL 增加复杂度却未带来收益,反而易出错

如果需要带参数的单例(如依赖注入场景)

Go 不支持构造函数重载,但可通过闭包或初始化函数封装参数。关键仍是确保“仅初始化一次”:

  • 将参数传入初始化函数,或通过闭包捕获外部变量
  • 仍用 sync.Once 控制执行时机
  • 注意:参数应在首次调用前就确定好,否则可能引发逻辑错误

例如:

var (
    instance *Singleton
    once     sync.Once
    config   Config // 外部配置,需提前设置
)

func InitWithConfig(c Config) *Singleton {
    once.Do(func() {
        instance = &Singleton{config: c}
    })
    return instance
}

补充:饿汉式单例(编译期初始化)

若实例创建开销小、无依赖外部资源,也可用包级变量直接初始化:

var instance = &Singleton{}

func GetInstance() *Singleton {
    return instance
}

这种方式天然线程安全(变量初始化在 init() 阶段完成,由 Go 运行时保证),但缺乏懒加载特性,不适合初始化成本高或依赖运行时环境的场景。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

650

2023.06.15

java流程控制语句有哪些
java流程控制语句有哪些

java流程控制语句:1、if语句;2、if-else语句;3、switch语句;4、while循环;5、do-while循环;6、for循环;7、foreach循环;8、break语句;9、continue语句;10、return语句。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

453

2024.02.23

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

722

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

725

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

394

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

441

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

426

2023.08.02

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2万人学习

C# 教程
C# 教程

共94课时 | 5.2万人学习

Java 教程
Java 教程

共578课时 | 36.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号