美文网首页
go单例模式之懒汉模式

go单例模式之懒汉模式

作者: CaiGuangyin | 来源:发表于2020-01-05 14:49 被阅读0次

可以通过sync包中的sync.Once实现单例模式。

var once sync.Once
// 传入方法Do()中的函数只会被执行一次。
once.Do(func(){})

如下是once.go中的Do()方法的源码:

func (o *Once) Do(f func()) {
    if atomic.LoadUint32(&o.done) == 1 {
        return
    }
    // Slow-path.
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        defer atomic.StoreUint32(&o.done, 1)
        f()
    }
}

下面是用sync.Once实现的单例模式

package main

import (
    `fmt`
    `sync`
)

type Singleton struct {}

var singleton *Singleton
var once sync.Once

func GetSingletonObj() *Singleton {
    once.Do(func() {
        fmt.Println("create singletonObj.")
        singleton = new(Singleton)
    })
    return singleton
}

func main() {
    var wg sync.WaitGroup
    for i:=0;i<10;i++ {
        wg.Add(1)    // 往等待组中添加一个协程
        go func() {
            singleObj := GetSingletonObj()
                        // 打印singleObj的指针
            fmt.Printf("singleObj mem addr: %p\n", singleObj)
            wg.Done()    // 协程执行完毕,会调用`wg.Add(-1)`将计数减1
        }()
    }
    wg.Wait()    // 等待所有协程执行完毕
}

sync.WaitGroup的作用是让主函数main()等待所有协程go func(){}执行完后才退出。

输出的结果如下:

create singletonObj.
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0
singleObj mem addr: 0x5851d0

从输出结果可以看出,create singletonObj只被打印了一次,也就证明传入once.Do()中的函数只被执行了一次,而GetSingletonObj()只在第一次执行时会创建一个singleton,后面每次执行返回的都是同一个singleton,从输出结果的singleObj mem addr就可以看出来。

相关文章

  • Java23种设计模式之「单例模式」

    单例模式 之 holder 模式 (推荐) 单例模式 之 饱汉模式(懒汉模式) 单例模式 之 双重锁检查 (Dou...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 大话设计模式之_单例模式

    大话设计模式之___单例模式 什么是单例模式单例模式有哪些(会顺带讲些懒汉式的性能优化)懒汉式与饿汉式的区别 什么...

  • java的单例模式

    饿汉单例模式 懒汉单例模式

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • go单例模式之懒汉模式

    可以通过sync包中的sync.Once实现单例模式。 如下是once.go中的Do()方法的源码: 下面是用sy...

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • Java单例模式

    1. 实现单例模式 饿汉模式和懒汉模式单例模式根据实例化时机分为饿汉模式和懒汉模式。饿汉模式,是指不等到单例真正使...

  • Singleton 单例模式

    饿汉式单例模式 饿汉式单例模式 通过静态代码块增加异常处理 懒汉式单例模式 存在线程安全问题 懒汉式单例模式 解决...

网友评论

      本文标题:go单例模式之懒汉模式

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