golang 单例模式

发布时间:2024-07-03 07:14:37

在Go语言中,单例模式是一种常见的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。通过使用单例模式,我们可以避免创建多个实例,节省内存资源,并确保数据一致性。下面我将详细介绍如何在Golang中实现单例模式。

使用sync.once实现懒汉式单例

懒汉式单例模式是指在第一次使用时才进行实例化的方式。在Golang中,我们可以使用sync.Once来实现线程安全的懒汉式单例。

sync.Once包中的Once结构体提供了Do方法,该方法接收一个无参数的函数作为参数,并保证该函数只会被执行一次。我们可以利用这个特性来实现单例模式。

下面是一个使用sync.Once实现懒汉式单例模式的例子:

package singleton
import "sync"

type singleton struct {
    data string
}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{
            data: "Hello World",
        }
    })
    return instance
}

使用sync.Mutex实现饿汉式单例

饿汉式单例模式是指在程序启动时就进行实例化的方式,在Golang中,我们可以使用sync.Mutex来保证线程安全。

下面是一个使用sync.Mutex实现饿汉式单例模式的例子:

package singleton
import "sync"

type singleton struct {
    data string
}

var instance *singleton
var lock = &sync.Mutex{}

func GetInstance() *singleton {
    lock.Lock()
    defer lock.Unlock()
    
    if instance == nil {
        instance = &singleton{
            data: "Hello World",
        }
    }
    return instance
}

使用sync.Once和sync.RWMutex实现双重检查锁定

双重检查锁定是一种将懒汉式单例与饿汉式单例结合起来的方式,在Golang中,我们可以使用sync.Once和sync.RWMutex来实现双重检查锁定。

sync.RWMutex是一种读写锁,它允许多个读操作同时进行,但在写操作进行时会阻塞读操作和其他写操作。

在双重检查锁定中,我们首先使用读锁判断实例是否已经被创建,如果没有则使用写锁进行实例的初始化,然后再使用读锁获取实例。

下面是一个使用sync.Once和sync.RWMutex实现双重检查锁定的例子:

package singleton
import "sync"

type singleton struct {
    data string
}

var instance *singleton
var lock = &sync.RWMutex{}
var once sync.Once

func GetInstance() *singleton {
    if instance == nil {
        lock.Lock()
        defer lock.Unlock()
        
        if instance == nil {
            once.Do(func() {
                instance = &singleton{
                    data: "Hello World",
                }
            })
        }
    }
    return instance
}

相关推荐