实现单例模式

🟡 中等

题目描述

使用 sync.Once 实现一个线程安全的单例模式。

参考答案

package singleton

import "sync"

type Singleton struct {
    value int
}

var (
    instance *Singleton
    once     sync.Once
)

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{value: 42}
    })
    return instance
}

关键点

  1. sync.Once 保证:函数只执行一次
  2. 线程安全:多个 goroutine 同时调用,只有一个执行初始化
  3. 延迟初始化:首次调用时才创建实例

扩展:为什么不用双重检查锁?

// ❌ Go 不需要双重检查锁
var mu sync.Mutex

func GetInstance() *Singleton {
    if instance == nil {  // 第一次检查
        mu.Lock()
        defer mu.Unlock()
        if instance == nil {  // 第二次检查
            instance = &Singleton{}
        }
    }
    return instance
}

Go 的 sync.Once 已经优化了性能,双重检查锁没有优势。