热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

go设计模式之单例模式浅谈

go设计模式之单例模式浅谈-概念保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现单例实现有两种方式,分别是饿汉模式和懒汉模式,下面分别说明:1.饿汉模式type

概念

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现

单例实现有两种方式,分别是饿汉模式和懒汉模式,下面分别说明:

1.饿汉模式

type single struct {}
var instance *single
instance = &single{}

func GetSingle() *single {
    return instance
}

饿汉模式存在问题,示例就是压根没使用都会自动创建,这时懒汉模式就排上用场了

2.懒汉模式

1)非安全模式

//非安全模式
type single struct {}
var instance *single
func GetSingle() *single {
    if instance == nil {
        instance = &single{}
    }
    return instance
}

懒汉模式只有通过第一次调用GetSingle时才会创建,但上面GetSingle在多线程环境下是不安全的,通过测试

type single struct {}
var instance *single
func GetSingle() *single {
    if instance == nil {
        fmt.Println("创建实列")
        instance = &single{}
    }
    return instance
}

//通过开启1000个协程,发现会打印出多个"创建实列"
for i := 0; i <1000; i++{
    go GetSingle()
}

通过测试,发现会打印出多个"创建实列",即实列被创建了多次,我们可以通过枷锁的方式,保证GetSingle每次只能被一个协程访问

2)安全模式

type single struct {}
var instance *single
var m sync.Mutex
func GetSingle() *single {
    if instance == nil {
        m.Lock() //加锁,防止多线程异常
        if instance == nil {
            instance = &single{}
        }
        m.Unlock()
    }
    return instance
}

3)go专属单例实现

go语言有一个once.Do函数,保证函数只被执行一次,利用这一特性,来实现单例, once.Do是多协程安全的

type single struct {}
var instance *single
var once sync.Once
func GetSingle() *single {
    once.Do(func() {
        instance= &single{}
    })
    return instance
}

推荐阅读
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 作为一名Ruby初学者,我对Comparable和Enumerable Mixin的用途感到困惑。本文旨在通过实例详细解释这两个Mixin的功能及其在实际编程中的应用。 ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 本文详细介绍了如何在Android应用中实现重复报警功能。示例代码可在以下路径找到:https://developer.android.com/samples/RepeatingAlarm/index.html。首先,我们将从Manifest文件开始分析。 ... [详细]
  • 本文介绍了如何在Android应用中通过Intent调用其他应用的Activity,并提供了详细的代码示例和注意事项。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有