分享
  1. 首页
  2. 文章

golang单例模式

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

1、定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问。

2、分类:

  • 懒汉方式:指全局的单例实例在第一次被使用时构建。
  • 饿汉方式:指全局的单例实例在类装载时构建。

3、实现:

(1)懒汉方式

1 type singleton struct{}
2 var ins *singleton
3 func GetIns() *singleton{
4 if ins == nil {
5  ins = &singleton{}
6  }
7 return ins
8 }

缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。

(2)饿汉方式

1 type singleton struct{}
2 var ins *singleton = &singleton{}
3 func GetIns() *singleton{
4 return ins
5 }

缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。

(3)懒汉加锁

 1 type singleton struct{}
 2 var ins *singleton
 3 var mu sync.Mutex
 4 func GetIns() *singleton{
 5  mu.Lock()
 6  defer mu.Unlock()
 7 
 8 if ins == nil {
 9  ins = &singleton{}
10  }
11 return ins
12 }

缺点:虽然解决并发的问题,但每次加锁是要付出代价的

(4)双重锁

 1 type singleton struct{}
 2 var ins *singleton
 3  var mu sync.Mutex
 4 func GetIns() *singleton{ 
 5  if ins == nil {
 6   mu.Lock()
 7  defer mu.Unlock()
 8 if ins == nil {
 9  ins = &singleton{}
10  }
11  }
12 return ins
13 }

避免了每次加锁,提高代码效率

(5)sync.Once实现

1 type singleton struct{}
2 var ins *singleton
3 var once sync.Once
4 func GetIns() *singleton {
5  once.Do(func(){
6 ins = &singleton{}
7  })
8 return ins
9 }

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

本文来自:博客园

感谢作者:YYRise

查看原文:golang单例模式

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏