非线程安全的懒汉

在多线程下可能会创建多次对象

  1. package single
  2. import "sync"
  3. var lm *lazyMan
  4. type lazyMan struct {
  5. age int
  6. mux sync.RWMutex
  7. }
  8. func GetLazyMan() *lazyMan {
  9. if lm == nil {
  10. lm = new(lazyMan)
  11. }
  12. return lm
  13. }
  14. func (lm *lazyMan) IncrementAge() {
  15. lm.mux.Lock()
  16. defer lm.mux.Unlock()
  17. lm.age++
  18. }
  19. func (lm *lazyMan) GetAge() int {
  20. lm.mux.RLock()
  21. defer lm.mux.RUnlock()
  22. return lm.age
  23. }

线程安全的懒汉

  1. // 双重检测锁(DCL懒汉式)
  2. // 避免每次加锁,提高代码效率
  3. func GetLazyManSync() *lazyMan {
  4. if lm == nil {
  5. lock.Lock()
  6. defer lock.Unlock()
  7. if lm == nil {
  8. lm = new(lazyMan)
  9. }
  10. }
  11. return lm
  12. }
  1. var once sync.Once
  2. // sync.Once实现
  3. func GetLazyManOnce() *lazyMan {
  4. once.Do(func() {
  5. lm = new(lazyMan)
  6. })
  7. return lm
  8. }