• 开发那些事儿:如何利用Go单例模式保障流媒体高并发的安全性?


    作为开发者,熟知不同语言的特性、灵活运用各种语言的结合都是开发者需要考虑的内容。TSINGSEE青犀视频的研发人员在平台开发过程中,智能分析方面用Python编译会比较多,在部分基层调用能力上则采用Golang比较多,偶尔也会用到Java来做流式编程。

    今天和大家分享一点开发中的实践经验:关于Go的单例模式。

    在GO设计模式中,有一种模式为单例模式。单例模式也叫单子模式,是常用的模式之一,它能够保证系统运行中一个类只创建一个实例。Go语言实现单例模式有四种方式,分别是懒汉式、饿汉式、双重检查和sync.Once。

    下面是一个简单的GO实现的单例模式。代码如下:

    1. type singleton struct{}
    2. var instance = &singleton{}
    3. func GetSingleton() *singleton {
    4. return instance
    5. }

    定义singleton一个结构体,并初始化instance对象。GetSingleton()函数可获取singleton这个结构体的单实例对象。这种创建单例对象是在包加载时,就会立即创建对象。但是大多数情况下不推荐使用。

    如果单实例化时,初始化内容过多,则会造成程序加载的时间比较长。我们需要将instance的初始化对象移动到GetSingleton()函数里去。

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

    相比较上一种单例,这个单例是在GetSingleton()函数内部调用初始化instance的值。所以第一次调用的延迟到了GetSingleton()中。

    这种需要判断instance == nil的情况,但是仅判断nil并不十分可靠。如果存在多个goroutine同时调用,GetSingleton()则无法保证并发安全。

    那么这种情况就需要加一个锁,如果同时调用,这样就能保证并发安全。代码参考如下:

    1. import "sync"
    2. type singleton struct{}
    3. var instance *singleton
    4. var mtx sync.Mutex
    5. func GetSingleton() *singleton {
    6. if instance == nil {
    7. mtx.Lock()
    8. defer mtx.Unlock()
    9. if instance == nil {
    10. instance = &singleton{}
    11. }
    12. }
    13. return instance
    14. }

    作为一家起源于EasyDarwin开源框架的技术型企业,在开发过程中,我们也乐于和所有的技术开发爱好者们一起交流代码技术、分享开发经验,为大家提供一些小小的参考。

    TSINGSEE青犀视频的平台可拓展性强、兼容性高,操作简单、易于集成,在线下场景中均有大量落地应用。为了便于用户调用、集成与二次开发,我们的平台均提供了丰富的API接口供用户自由使用。感兴趣的用户可以前往演示平台进行体验或部署测试。

  • 相关阅读:
    经典JsonPath表达式
    基于VC++的WEB浏览器的实现
    这个方法可以实现自动抠图,快来get
    微信小程序之tabBar
    2022儿童护眼灯什么牌子的好?分享专业儿童护眼灯排名
    云网络与云计算:有什么区别?
    S&P 2022论文泛读
    iTextSharp操作PDF
    Keycloak服务开发-认证服务SPI
    cmake交叉编译时链接到x86库的问题
  • 原文地址:https://blog.csdn.net/TsingSee/article/details/125561116