Go 单例

栏目: Go · 发布时间: 5年前

内容简介:单例的作用不用我多说,大家都知道,那么在go中如何构造单例呢,下面是我的总结。一、 sync.Once用法在Go中有一个简洁的方法就是使用sync.Once,它可以在多协程中起到控制作用。实现起来也非常简单。

单例的作用不用我多说,大家都知道,那么在 go 中如何构造单例呢,下面是我的总结。

一、 sync.Once用法

在Go中有一个简洁的方法就是使用sync.Once,它可以在多协程中起到控制作用。实现起来也非常简单。

var (
    once     sync.Once
    instance *SingleTon
)

func GetInstance(str string) *SingleTon {
    once.Do(func() {
        instance = &SingleTon{Attr: str}
    })

    return instance
}

二、使用加锁机制

在Go语言中有个基础对象sync.Mutex,可以实现协程之间的同步逻辑。

var mu sync.Mutex

func GetInstance() *SingleTon {
  mu.Lock()
  defer mu.Unock()

    if Instance == nil {
        instance = &SingleTon{}
    }

    return instance
}

三、简单粗暴模式.

这种方式实现起来特别简单,直接判断一个实力是不是为nil, 如果是,则新生成;否则返回已有的。但它和多数语言一样,只适合用在单线程。这个就很鸡肋,几乎没有什么应用场景,倒是bug经常出在这里。

type SingleTon struct {
}

var instance *SingleTon

func GetInstance() *SingleTon {
    if Instance == nil {
        instance = &SingleTon{}
    }

    return instance
}

测试代码如下,从运行结果来看,都是一致的。

func main() {
    for i := 0; i < 10; i++ {
        go func() {
            s := GetInstance("test:" + strconv.Itoa(i))
            s.TestFunc()
        }()
    }
    time.Sleep(1e5)

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Systems

Distributed Systems

Sukumar Ghosh / Chapman and Hall/CRC / 2014-7-14 / USD 119.95

Distributed Systems: An Algorithmic Approach, Second Edition provides a balanced and straightforward treatment of the underlying theory and practical applications of distributed computing. As in the p......一起来看看 《Distributed Systems》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具