单例模式

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

  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提供的方法,一旦执行一次,就不再执行。


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

本文来自:简书

感谢作者:技术修仙

查看原文:单例模式

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

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