前言
单例模式是常用的一种设计模式,一般用于比如客户端、连接的创建等,防止创建多个导致性能消耗。所以我认为单例模式的核心,就是“防止重复”。本文将在Golang中进行单例模式的实现。
实现
版本1——检测-创建
最基础的版本,就是依照“防止重复”来实现。代码如下:
package main
type Test1 struct {
}
var t1 *Test1
func main() {
}
func NewT1() *Test1 {
if t1 == nil {
t1 = &Test1{
}
}
return t1
}
可见,只是在创建前,进行了一个判定,如果为空 再创建。不为空则直接返回。
但是这样版本存在有问题——即线程不安全。比如多个goroutine中同时运行其去创建,那么就很容易导致创建重复。
对此,解决方案也很简单——加锁即可。
版本2——加锁-检测-创建
很简单粗暴的加个锁——这样就能保证只有一个去进行检测、创建。规避了问题。
var mutex sync.Mutex
func NewT1