go语言设计模式之单例模式(字节教育)

单例模式

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

懒汉模式

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

//懒汉模式
type singleton struct {
}

var instance *singleton

func GerInstance() *singleton {
	if instance == nil {
		instance = &singleton{}
	}
	return instance
}

带锁的单例模式

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

 //带锁的单例模式
type singleton struct {
}
var instance *singleton
var mu sync.Mutex
func GerInstance2() *singleton {
	mu.Lock()
	defer mu.Unlock()
	if instance == nil {
		instance = &singleton{}
	}
	return instance
}

带检查锁的单例模式

//带锁的单例模式
type singleton struct {
}

var instance *singleton
var mu sync.Mutex

func GerInstance() *singleton {
	if instance == nil {
		mu.Lock()
		defer mu.Unlock()
		if instance == nil {
			instance = &singleton{}
		}
	}
	return instance
}

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

var initialized uint32

type singleton struct {
}

var instance *singleton
var mu sync.Mutex

func GerInstance() *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

//比较好的一种方式sync.Once
type singleton struct {
}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
	once.Do(func() {
		instance = &singleton{}
	})
	return instance
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值