Golang设计模式之单例

PHP二次开发 Golang 84 次浏览 , , 没有评论

懒汉模式

这种方式实现起来特别简单,直接判断一个实力是不是为nil, 如果是,则新生成;否则返回已有的。但它和多数语言一样,只适合用在单线程。

  1. type SingleTon struct {
  2. }
  3.  
  4. var instance *SingleTon
  5.  
  6. func GetInstance() *SingleTon {
  7. if Instance == nil {
  8. instance = &SingleTon{}
  9. }
  10.  
  11. return instance
  12. }

使用加锁机制

在Go语言中有个基础对象sync.Mutex,可以实现协程之间的同步逻辑。

  1. var mu sync.Mutex
  2.  
  3. func GetInstance() *SingleTon {
  4. mu.Lock()
  5. defer mu.Unock()
  6.  
  7. if Instance == nil {
  8. instance = &SingleTon{}
  9. }
  10.  
  11. return instance
  12. }

sync.Once用法

在Go中还有一个更简洁的方法就是使用sync.Once,它可以在多协程中起到控制作用。实现起来也非常简单。

  1. var (
  2. once sync.Once
  3. instance *SingleTon
  4. )
  5.  
  6. func GetInstance(str string) *SingleTon {
  7. once.Do(func() {
  8. instance = &SingleTon{Attr: str}
  9. })
  10.  
  11. return instance
  12. }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Go