非线程安全的懒汉
在多线程下可能会创建多次对象
package singleimport "sync"var lm *lazyMantype lazyMan struct {age intmux sync.RWMutex}func GetLazyMan() *lazyMan {if lm == nil {lm = new(lazyMan)}return lm}func (lm *lazyMan) IncrementAge() {lm.mux.Lock()defer lm.mux.Unlock()lm.age++}func (lm *lazyMan) GetAge() int {lm.mux.RLock()defer lm.mux.RUnlock()return lm.age}
线程安全的懒汉
// 双重检测锁(DCL懒汉式)// 避免每次加锁,提高代码效率func GetLazyManSync() *lazyMan {if lm == nil {lock.Lock()defer lock.Unlock()if lm == nil {lm = new(lazyMan)}}return lm}
var once sync.Once// sync.Once实现func GetLazyManOnce() *lazyMan {once.Do(func() {lm = new(lazyMan)})return lm}
