go设计模式——单例模式

单例模式主要有两种:懒汉式和饿汉式

//懒汉式--非线程安全
//使用结构体代替类
type Tool struct {
	values int
}
//建立私有变量
var instance *Tool
//获取单例对象的方法,引用传递返回
func GetInstance()*Tool{
	if instance==nil{
		instance=new(Tool)
	}
	return instance
}

  

//懒汉式--线程安全--每次操作进行加锁操作-性能不是很高
//使用结构体代替类

type Tool struct {
	values int
}
//建立私有变量
var instance *Tool
//锁对象
var lock sync.Mutex
//获取单例对象的方法,引用传递返回
func GetInstance()*Tool{
	lock.Lock()
	defer lock.Unlock()
	if instance==nil{
		instance=new(Tool)
	}
	return instance
}

  

//懒汉式--双重检查
//在懒汉式(线程安全)的基础上再进行优化,减少加锁的操作,保证线程安全的同时不影响性能

//使用结构体代替类
type Tool struct {
	values int
}
//锁对象
var lock sync.Mutex
var instance *Tool
//第一次判断不加锁,第二次加锁保证线程安全,一旦对象建立后,获取对象就不用加锁了。
func GetInstance()*Tool{
	if instance==nil{
		lock.Lock()
		if instance ==nil{
			instance=new(Tool)
		}
		lock.Unlock()
	}
	return instance
}

  

//饿汉式--init()函数创建
//线程安全,唯一的缺点是在导入包的同时会创建该对象,并持续占有在内存中
type  Tool struct {
}
var tool *Tool
//初始化一个实例
func init(){
  tool=new(Tool)
}

//NewConfig 提供获取实例的方法
func NewTool()*Tool{
  return tool
}

  

//饿汉式--全局变量方式创建
//线程安全,唯一的缺点是在导入包的同时会创建该对象,并持续占有在内存
type Tool struct {
}
//全局变量
var tool *Tool = new(Tool)
// NewConfig 提供获取实例的方法
func NewConfig() *Tool {
	return tool
}

通过 sync.Once 来确保创建对象的方法只执行一次----具有双重检查的效果,sync.Once内部已封装判断

var once sync.Once
func GetInstance() *Tool{
	once.Do(func() {
		instance = new(Tool)
	})
	return instance
}

  

猜你喜欢

转载自www.cnblogs.com/chen-ya-ping/p/12463422.html
今日推荐