golang mysql单例模式_Golang单例模式

原标题:Golang单例模式

共 21695分钟

939f76c3f25c17752fce7b9ee7088f7a.png

单例模式,是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

懒汉模式(Lazy Loading)

懒汉模式是开源项目中使用最多的一种,最大的缺点是非线程安全的

type singleton struct {}// privatevar instance *singleton// publicfunc GetInstance() *singleton { if instance == nil { instance = &singleton{} // not thread safe } return instance}

带锁的单例模式

type singleton struct {}var instance *singletonvar mu sync.Mutexfunc GetInstance() *singleton { mu.Lock() defer mu.Unlock() if instance == nil { instance = &singleton{} // unnecessary locking if instance already created } return instance}

这里使用了Go的sync.Mutex,其工作模型类似于Linux内核的futex对象,具体实现极其简单,性能也有保证初始化时填入的0值将mutex设定在未锁定状态,同时保证时间开销最小这一特性允许将mutex作为其它对象的子对象使用

带检查锁的单例模式

if instance == nil { //

这是一个不错的方法,但是还并不是很完美。因为编译器优化没有检查实例存储状态。如果使用sync/atomic包的话 就可以自动帮我们加载和设置标记。

import "sync"import "sync/atomic"var initialized uint32...func GetInstance() *singleton { if atomic.LoadUInt32(&initialized) == 1 { return instance } mu.Lock() defer mu.Unlock() if initialized == 0 { instance = &singleton{} atomic.StoreUint32(&initialized, 1) } return instance}

比较好的一种方式sync.Once

import ( "sync") type singleton struct {} var instance *singletonvar once sync.Once func GetInstance() *singleton { once.Do(func() { instance = &singleton{} }) return instance}

引文:

https://xiequan.info/go%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值