美文网首页程序员
单例模式(Go)

单例模式(Go)

作者: 高稚商de菌 | 来源:发表于2018-03-06 21:28 被阅读0次

    单例模式是23种面向对象的设计模式之一。在实际应用中,涉及到配置或资源管理的对象,都应该考虑单例模式。广义上讲,只要能够保证只执行一次类的实例化过程,就能实现单例模式。如果某段代码确实只会执行一次,那么就是一个天然的单例模式,比如python里的模块导入。而有的时候,初始化对象的函数可能要执行多次,这时就需要对类的实例化进行拦截。单例模式最基本的问题,是判断是否类已经实例化,这就需要用一个变量,来判断,比如锁,全局变量,类变量(Python), 闭包(Python)等等。

    type singleton struct {}
    var single *singleton
    

    1.最简单的单例模式

    // 非线程安全的单例模式
    func GetInstance1() *singleton {
        if single == nil {
            single = &singleton{}
        }
        return single
    }
    

    2.线程安全的单例模式

    // 线程安全的单例模式
    import "sync"
    var lock sync.Mutex
    
    func GetInstance2() *singleton {
        lock.Lock()
        defer lock.Unlock()
        if single == nil {
            single = &singleton{}
        }
        return single
    }
    

    3.优化的线程安全单例模式

    // 线程安全的单例模式,且降低锁的开销
    func GetInstance3() *singleton {
        if single == nil {
            lock.Lock()
            defer lock.Unlock()
            if single == nil {
                single = &singleton{}
            }
        }
        return single
    }
    

    4. 使用sync.Once

    // 使用sync.Once, 代码最优雅
    var once sync.Once
    func GetInstance3() *singleton {
        once.Do(func(){
            single = &singleton{}
        })
        return single
    }
    

    相关文章

      网友评论

        本文标题:单例模式(Go)

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