前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GO 单例模式

GO 单例模式

作者头像
孤烟
发布2020-09-27 11:02:49
1.1K0
发布2020-09-27 11:02:49
举报
文章被收录于专栏:golang开发笔记

单例模式是常用的模式之一,一般介绍的单例模式有 饿汉式懒汉式 等,不管那种模式最终目的只有一个,就是只实例化一次,仅允许一个实例存在。

GO语言实现单例模式相对简单,这里考虑到并发,用到了sync.Mutex 和结构体sync.Once。

示例:

代码语言:javascript
复制
package main

import (
   "fmt"
   "sync"
)

var (
   lock     *sync.Mutex = &sync.Mutex{}
   instance *Singleton
)
type Singleton struct {
}

func GetInstance() *Singleton {
   if instance == nil {
      lock.Lock()
      defer lock.Unlock()
      if instance == nil {
         instance = &Singleton{}
         fmt.Println("instance...")
      }
   }
   return instance
}

func main() {
   var s *Singleton
   s = GetInstance()
   s = GetInstance()
   fmt.Println(s)
}

执行结果:

instance... &{}

通过结果可以看到只输出了一个instance...。

上面的实现方式还可以通过结构体sync.Once更优雅的实现。

示例:

代码语言:javascript
复制
package main

import (
   "fmt"
   "sync"
)

var (
   once sync.Once
   instance *Singleton
)

type Singleton struct {
}

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
        fmt.Println("instance...")
    })
   return instance
}

func main() {
   var s *Singleton
   s = GetInstance()
   s = GetInstance()
   fmt.Println(s)
}

输出结果:

instance... &{}

通过sync.Once的源代码查看它是如何运行的

代码语言:javascript
复制
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.Do(f func())使用加锁原子操作(代码包sync/atomic)来保证函数 f 只执行一次。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档