单例模式

2020-01-13  本文已影响0人  鬼厉
  1. 介绍
    单例模式指只能被实例化一次
    特点:
    a) 类构造器私有
    b) 持有自己类型的属性
    c) 对外提供获取实例的静态方法
    在实现上有懒汉方式,饿汉方式,懒汉加锁,双重锁,sync.Once实现等不同的实现方法。

  2. 代码示例
    a) 懒汉方式

type singleton struct{}
var ins *singleton
func GetIns() *singleton{
    if ins == nil {
        ins = &singleton{}
    }
    return ins
}

缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。

b) 饿汉方式

type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
    return ins
}

缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。

c) 懒汉加锁

type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
    mu.Lock()
    defer mu.Unlock()

    if ins == nil {
        ins = &singleton{}
    }
    return ins
}

缺点:虽然解决并发的问题,但每次加锁是要付出代价的

d) 双重锁

type singleton struct{}
var ins *singleton
var mu sync.Mutex
 func GetIns() *singleton{  
    if ins == nil {
        mu.Lock()
        defer mu.Unlock()
        if ins == nil {
                ins = &singleton{}
        }
  }  

e) sync.Once实现

type singleton struct{}
var ins *singleton
var once sync.Once
func GetIns() *singleton {
     once.Do(func(){
        ins = &singleton{}
     })
return ins
}

推荐采用此方法。
sync.Once是golang提供的方法,一旦执行一次,就不再执行。

上一篇下一篇

猜你喜欢

热点阅读