golang设计模式之单例模式

golang设计模式之单例模式

核心作用

保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

优点

  1. 由于单例模式只生成一个实例,减少系统性能开销,当一个对象的生产需要比较多资源时,就可以通过在应用启动的时候直接产生一个单例对象,然后永久驻留内存,例如日志模块
  2. 单例模式可以在系统设置全局访问点,优化资源共享问题,比如数据库里连接池

常见几种实现方式

  1. 饿汉式(调用效率高,不能延时加载)
  2. 懒汉式(调用效率不高,可以延时加载)
  3. 懒汉加锁(调用效率不高,可以延时加载)
  4. 双重锁(调用效率不高,可以延时加载)
  5. once单例(调用效率高,不能延时加载)

简单实现

1. 饿汉

缺点:系统初始化时加载,有可能没有用到GetInstance方法,但是一直是占用资源的,如果初始化比较复杂,加载时间会长

type SingletonDemon2 struct {} 

var singletonDemon2 = &SingletonDemon2{}

func GetInstance()  *SingletonDemon2{
	return singletonDemon2
}

2. 懒汉

缺点:延时加载,懒加载,真正用的时候才加载,资源利用率高了,但是每次调GetInstance用都要同步,并发量高得时候有可能会建立多个对象

type SingletonDemon1 struct {}

var singletonDemon1 *SingletonDemon1

func GetInstance() *SingletonDemon1  {
	if singletonDemon1 == nil {
		singletonDemon1 = &SingletonDemon1{}
	}
	return  singletonDemon1
}

3. 懒汉加锁模式

缺点:多线程并发量高的时候,每次都要lock,影响性能

type SingleTonDemon3 struct {}

var singletonDemon3 *SingleTonDemon3
var mutex sync.Mutex

func GetInstance3() *SingleTonDemon3{
	mutex.Lock()
	defer  mutex.Unlock()
	if singletonDemon3  == nil{
		singletonDemon3 = &SingleTonDemon3{}
	}
	return singletonDemon3
}

4. 双重锁模式

判断不为空时在加锁,当instance为null并且同时有2个线程调用getInstance方法时候,他们都会通过第一重的instance == null 的判断。如果没有第二个判断,就多new了空间,而且不能释放。

type SingleTonDemon4 struct {}
var singletonDemon4 *SingleTonDemon4
var mutx sync.Mutex

func GetInstance4() *SingleTonDemon4{
	if singletonDemon4 == nil{
		mutx.Lock()
		if singletonDemon4  == nil{
			 singletonDemon4 = &SingleTonDemon4{}
			 mutx.Unlock()
			 return singletonDemon4
		}

	}
	mutx.Unlock()
	return singletonDemon4
}

5. sync.once

看once.Do源码可以看到只有在 done 等于 0 的时候才调用 f(),一旦调用后 done 的值被置为 1

type Singleton struct {}

var singleton *Singleton
var once sync.Once

func GetInstance() *Singleton  {
	once.Do(func() {
		singleton = &Singleton{}
	})
	return  singleton
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值