Golang设计模式-单例模式

為{幸葍}努か 提交于 2020-02-27 15:10:37

Golang单例模式实现

go语言做开始的必然是并发业务,所谓的单例模式也必须加锁否则会不断生成新的实例,不加锁的部分就不写了.

直接记录几个能用的到的单例模式,由浅入深.

懒汉加锁模式

package pattern

import "sync"

type singleton struct{}

var instance *singleton
var mu sync.Mutex

//获取实例
func GetInstance() *singleton {
   //这种结构的单例模式,会导致每次都加锁,严重浪费性能
   mu.Lock()
   defer mu.Unlock()
   if instance == nil {
      instance = &singleton{}
   }
   return instance
}

懒汉双重锁检测模式

package pattern

import "sync"

//单例模式
type singleton struct{}

var instance *singleton
var mu sync.Mutex

//获取实例
func GetInstance() *singleton {
    //不会导致每次都加锁,因为率先判断了随后才加的锁
   //如果没有被实例化
   if instance == nil {
      //加锁
      mu.Lock()
      //实例化返回,并解锁
      defer mu.Unlock()
      //如果没有被实例化
      if instance == nil {
         instance = &singleton{}
      }
   }

   return instance
}

利用内置的sync.Once来实现

package pattern

import "sync"

//单例模式
type single struct{}

var instance *singleton
//sync.Once能确保实例化对象Do方法在多线程环境只运行一次,内部通过互斥锁实现,它的内部本质上也是双重检查的方式
var lock sync.Once

func GetInstance() *singleton {
   lock.Do(func() {
      instance = &singleton{}
   })

   return instance
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!