golang 单例模式

单例模式,全局只有一个实例,无法再新建

饿汉模式:提前创建实例,提供一个对外方法,返回此实例
代码如下:

// Singleton 饿汉式单例, 都使用小写,无法导出,外部包没法直接创建
type singleton struct{
	name string
}

// 通过一个导出类型暴露出去*singleton,由于Singleton内部属性无法导出,所以外部也没法创建(只能创建一个空对象)
type Singleton struct {
	*singleton
}

var single *Singleton

func init() {    // 提前创建好的一个实例,通过GetInstance方法,获取到的实例都是这个
	single = &Singleton{&singleton{name: "test"}}

}

func (s *Singleton)GetName() string {
	return s.name
}

// GetInstance 获取实例
func GetInstance() *Singleton {
	return single
}

饱汉模式:熟称懒加载,就是在你使用实例的时候才去加载,对于懒汉模式,由于没有提前加载,在并发条件下,可能会出现两个协程同时去创建,一开始判断都是nil,会出现重复创建,所以需要进行双检(存在性检查,是否有别的协程已经调用创建,go的话我们用once.Do实现)
代码如下:

import (
	"fmt"
	"sync"
)

var (
	lazySingleton *Singleton
	once          = &sync.Once{}
)

// GetLazyInstance 懒汉式
func GetLazyInstance() *Singleton {
	if lazySingleton == nil {   // 检测对象是否存在
		once.Do(func() {      //保证并发条件下值创建一次对象
			fmt.Println("create")
			lazySingleton = &Singleton{&singleton{name: "test lazy"}}
		})
	}
	return lazySingleton
}

func main() {
	wait := sync.WaitGroup{}
	wait.Add(10)
	for i:= 0;i<10;i++ {
		go func() {
			defer wait.Done()
			s := create.GetLazyInstance()
			fmt.Println(s.GetName())
		}()
	}
	wait.Wait()
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值