Loading

Golang设计模式-单例模式

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
}
posted @ 2021-07-30 15:37  我爱吃炒鸡  阅读(110)  评论(0编辑  收藏  举报