sunkezai 发表于 2018-9-21 06:24:05

golang单例模式

  1、定义:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问。
  2、分类:  


[*]懒汉方式:指全局的单例实例在第一次被使用时构建。
[*]饿汉方式:指全局的单例实例在类装载时构建。
  3、实现:
  (1)懒汉方式  
  

type singleton struct{}  

var ins *singleton  

func GetIns() *singleton{  

if ins == nil {  

  ins = &singleton{}  

}  

return ins  

}  

  缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。
  (2)饿汉方式
  

type singleton struct{}  

var ins *singleton = &singleton{}  

func GetIns() *singleton{  

return ins  

}  

  缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。
  (3)懒汉加锁
  

type singleton struct{}  

var ins *singleton  

var mu sync.Mutex  

func GetIns() *singleton{  

mu.Lock()  

defer mu.Unlock()  

  
   if ins == nil {
  
     ins = &singleton{}
  
   }
  
   return ins
  
}
  

  缺点:虽然解决并发的问题,但每次加锁是要付出代价的
  (4)双重锁
  

type singleton struct{}  

var ins *singleton  

var mu sync.Mutex  

func GetIns() *singleton{  

  if ins == nil {  

  mu.Lock()  

defer mu.Unlock()  

if ins == nil {  

  ins = &singleton{}  

}  

}  

return ins  

}  

  避免了每次加锁,提高代码效率
  (5)sync.Once实现
  

type singleton struct{}  

var ins *singleton  

var once sync.Once  

func GetIns() *singleton {  

once.Do(func(){  

ins = &singleton{}  

})  

return ins  

}  



页: [1]
查看完整版本: golang单例模式