1.创建型--单例模式

1.单例模式

单例模式采用了 饿汉式 和 懒汉式 两种实现,个人其实更倾向于饿汉式的实现,简单,并且可以将问题及早暴露,懒汉式虽然支持延迟加载,但是这只是把冷启动时间放到了第一次使用的时候,并没有本质上解决问题,并且为了实现懒汉式还不可避免的需要加锁。

  • 饿汉式
package singleton

//饿汉式单例
type Singleton struct{}

var singleton *Singleton

//采用init性能会更好一些
func init() {
	singleton = &Singleton{}
}

//获取单例
func GetInstance() *Singleton {
	return singletons
}
  • 懒汉式(双重检测)

(1)采用once.Do()函数实现,可以控制函数只调用一次,来确保单例

package singleton

import "sync"

var (
	lazySingleton *Singleton
	once          = &sync.Once{}
)

// 懒汉式
func GetLazyInstance() *Singleton {
	if lazySingleton == nil {
		once.Do(func() {
			lazySingleton = &Singleton{}
		})
	}
	return lazySingleton
}

(2)采用互斥锁实现

package main

import (
	"fmt"
	"sync"
)

type Singleton struct {
}

var instance *Singleton
var mu sync.Mutex

//懒汉式加锁实现
func GetInstance() *Singleton {
	mu.Lock()
	defer mu.Unlock()
	if instance == nil {
		instance = &Singleton{}
	}
	return instance
}

func main() {
	s := GetInstance()
	fmt.Printf("get instance succ,s=%+v", s)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值