美文网首页
单例模式

单例模式

作者: 鬼厉 | 来源:发表于2020-01-13 18:11 被阅读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提供的方法,一旦执行一次,就不再执行。

    相关文章

      网友评论

          本文标题:单例模式

          本文链接:https://www.haomeiwen.com/subject/zkjnactx.html