美文网首页
单例模式

单例模式

作者: 鬼厉 | 来源:发表于2020-01-13 18:11 被阅读0次
  1. 介绍
    单例模式指只能被实例化一次
    特点:
    a) 类构造器私有
    b) 持有自己类型的属性
    c) 对外提供获取实例的静态方法
    在实现上有懒汉方式,饿汉方式,懒汉加锁,双重锁,sync.Once实现等不同的实现方法。

  2. 代码示例
    a) 懒汉方式

type singleton struct{}
var ins *singleton
func GetIns() *singleton{
    if ins == nil {
        ins = &singleton{}
    }
    return ins
}

缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。

b) 饿汉方式

type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
    return ins
}

缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。

c) 懒汉加锁

type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
    mu.Lock()
    defer mu.Unlock()

    if ins == nil {
        ins = &singleton{}
    }
    return ins
}

缺点:虽然解决并发的问题,但每次加锁是要付出代价的

d) 双重锁

type singleton struct{}
var ins *singleton
var mu sync.Mutex
 func GetIns() *singleton{  
    if ins == nil {
        mu.Lock()
        defer mu.Unlock()
        if ins == nil {
                ins = &singleton{}
        }
  }  

e) sync.Once实现

type singleton struct{}
var ins *singleton
var once sync.Once
func GetIns() *singleton {
     once.Do(func(){
        ins = &singleton{}
     })
return ins
}

推荐采用此方法。
sync.Once是golang提供的方法,一旦执行一次,就不再执行。

相关文章

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • 单例模式

    单例模式1 单例模式2

  • java的单例模式

    饿汉单例模式 懒汉单例模式

网友评论

      本文标题:单例模式

      本文链接:https://www.haomeiwen.com/subject/zkjnactx.html