单例

什么是单例?

 一个类/结构体在全局,只实例化一个对象。

为什么要有单例?

 1、对象重复创建,资源消耗
 2、多个对象操作一个资源,出现问题,要求必须时一个对象

如何实现一个单例

整体思路: 实例存在时,直接返回,不存在时创建并返回
关键点:1、并发问题 2、构造函数私有

最容易想到的是下面的实现。但是有个问题,协程并发获取时,仍然会创建多个对象。

package designpattern

import "fmt"

var singleton *Singleton
type Singleton struct {}

func (s *Singleton)GetInstance() *Singleton{
    if s == nil {
        s = &Singleton{}
        return s
    }
    return s
}

func (s *Singleton)Print() {
    fmt.Print("HelloWorld")
}

那获取锁之前,我们直接加个锁好了,是不是就可以解决并发的问题,代码如下


func (s *Singleton) GetInstanceV1() *Singleton {
    mutex.Lock()
    defer mutex.Unlock()
    if s == nil {
        s = &Singleton{}
        return s
    }
    return s
}

对象在第一次被创建后,都能够取得到,这个时候锁还有必要吗?加锁是不是浪费了资源?因此,我们想到,只在对象不存在时,加锁。

func (s *Singleton) GetInstanceV2() *Singleton {
    if s == nil {
        mutex.Lock()
        defer mutex.Unlock()
        if s == nil {
            s = &Singleton{}
                return s
        }
    }
    return s
}

todo
go本身的优雅实现
go如果私有化构造函数?目前来看,还是可以直接new一个对象

你可能感兴趣的:(单例)