教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang设计模式之单例模式

Golang设计模式之单例模式

发布时间:2022-02-28   编辑:jiaochengji.com
教程集为您提供Golang设计模式之单例模式等资源,欢迎您收藏本站,我们将为您提供最新的Golang设计模式之单例模式资源
<h1>单例模式</h1>

GitHub代码链接

<h2>解决的问题</h2>

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

<h3>优点</h3> <ul><li>内存中只有一个实例,减少内存开销</li> <li>避免对资源的多重占用,比如写文件的操作</li> </ul><h3>缺点</h3> <ul><li>没有接口,不能继承。</li> </ul><h2>代码实现</h2> <h3>1. 懒汉模式</h3>

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

<pre><code class="lang-go hljs">type Singleton struct{} var Instance *Singleton func GetInstance() *Singleton { if Instance == nil { Instance = &Singleton{} } return Instance } </code></code></pre> <h3>2. 饿汉模式</h3>

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

<pre><code class="lang-go hljs">type Singleton struct{} var Instance2 *Singleton = &Singleton{} func GetInstance2() *Singleton { return Instance2 } </code></code></pre> <h3>3. 带锁的懒汉模式</h3>

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

<pre><code class="lang-go hljs">var Instance3 *Singleton var mut sync.Mutex func GetInstance3() *Singleton { mut.Lock() defer mut.Unlock() if Instance3 == nil { Instance3 = &Singleton{} } return Instance3 } </code></code></pre> <h3>4. 双重锁的懒汉模式</h3>

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

<pre><code class="lang-go hljs">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 } </code></code></pre> <h3>5. Once实现懒汉模式</h3>

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

<pre><code class="lang-go hljs">var Instance5 *Singleton var once sync.Once func GetInstance5() *Singleton { once.Do(func() { Instance5 = &Singleton{} }) return Instance5 } </code></code></pre> 到此这篇关于“ Golang设计模式之单例模式”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
深入php设计模式实例详解
php工厂模式实例代码
【Go】Golang 实现单例模式
php常用设计模式之工厂模式与单例模式介绍
php单例模式为何只能实例化一次
python常用的几种设计模式是什么
Golang设计模式之单例模式
php单例模式有什么用
Golang设计模式之抽象工厂模式
php设计模式是什么,该如何理解

[关闭]
~ ~