Go语言高并发,单例,保姆级教程!
文章目录
在开发中,某些工具类我们只希望他在程序中被创建一次,每次使用时都不会再创建实例。 这个需求我们就可以使用到单例模式来处理。
一、单例模式能解决什么问题?
保证一个类只有一个实例
其实 go 语言中,没有类这个概念,被抽象成了结构体。 但是为了方便大家理解,我们依旧还是用类来描述,望大家能理解,别在这个问题上纠结。
他的运作方式是什么样的呢?
如果你创建了一个对象,过了一会儿再想创建新对象时,此时你获取到的是你之前创建的对象,而不是新的对象。
主要用处:
我们常用他来提供全局工具,通知中心,全局配置等地方。
二、实现方式
我们大致分为以下三步:
- 1、创建一个私有变量用于保存单例类型。 go 语言里面只要是小写字幕开头都属于是私有变量,包外就不能被调用。
- 2、我们需要对外提供一个构建单例的获取方法。 我们一般会以 Instance 来结尾或者开头。
- 3、在公有方法里面去判定私有变量是否被初始化并返回。
|
|
以下是运行结果:
|
|
你会发现 m1 和 m2 的地址是一样的,同时 m2 修改 Name 后 m1 也同样被修改了。 这就是一个最简单的单例代码。
三、并发情况下的问题
如果在生产中我们使用上面的方式去创建单例,在第三步时,高并发的情况会出现重复创建。
我们改下我们的 main 方法:
|
|
此时再运行:
|
|
我这里只截取了前面几个,你看前面两个和第三个就出现了不一样,后面的数据就基本不会出现异常了,因为私有变量已经被赋值了。
所以我们一般还会在第三步时给他加上锁,保证同一时间只执行一次。
|
|
这样就能保证我们在创建实例时,只会有一个线程在跑。
三、更便捷的方法
这样去写单例,代码其实有点多,我们可以使用官方的 sync 包里面的
|
|
是不是一下就清爽了!
你学废了么?
欢迎加入我们的交流群一起讨论。
只需要在公众号里面回复 加群 即可收获一群学习 Go 语言的小伙伴,快来吧!
文章作者 锟哥
上次更新 2022-04-04
许可协议 CC BY-NC-ND 4.0(如需转载,请在评论区留下您作品的地址,无需等待确认)
原文连接 https://blog.golangstack.com/post/golang-design-mode-instance/
关注我们的微信公众号,第一时间查看最新内容