Golang设计模式之单例模式

ShawnLee_123 · · 522 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

单例模式

GitHub代码链接

解决的问题

保证一个环境只有一个实例在运行。解决一个全局使用的类频繁的创建和销毁。

优点

  • 内存中只有一个实例,减少内存开销
  • 避免对资源的多重占用,比如写文件的操作

缺点

  • 没有接口,不能继承。

代码实现

1. 懒汉模式

缺点:非线程安全,当正在创建时,如果有线程来访,Instance == nil时,会重复创建,就不是单例模式了。

type Singleton struct{}
var Instance *Singleton

func GetInstance() *Singleton {
    if Instance == nil {
        Instance = &Singleton{}
    }
    return Instance
}

2. 饿汉模式

缺点:如果Singleton结构体创建比较耗时,加载时间会很长。

type Singleton struct{}
var Instance2 *Singleton = &Singleton{}

func GetInstance2() *Singleton {
    return Instance2
}

3. 带锁的懒汉模式

缺点:反复加锁会导致线程阻塞

var Instance3 *Singleton
var mut sync.Mutex

func GetInstance3() *Singleton {
    mut.Lock()
    defer mut.Unlock()
    if Instance3 == nil {
        Instance3 = &Singleton{}
    }
    return Instance3
}

4. 双重锁的懒汉模式

缺点:实现较复杂
优点: 性能提高

var Instance4 *Singleton
var mut2 sync.Mutex

func GetInstance4() *Singleton {
    if Instance4 == nil {
        mut2.Lock()
        defer mut2.Unlock()
        if Instance4 == nil {
            Instance4 = &Singleton{}
        }
    }
    return Instance4
}

5. Once实现懒汉模式

golang的sync包中,提供once锁once.Do(func(){})中的函数只会执行一次。这样的代码看上去也比较简洁。

var Instance5 *Singleton
var once sync.Once

func GetInstance5() *Singleton {
    once.Do(func() {
        Instance5 = &Singleton{}
    })
    return Instance5
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ShawnLee_123

查看原文:Golang设计模式之单例模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

522 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传