go不应该用JAVA设计模式_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

}

你可能感兴趣的:(go不应该用JAVA设计模式)