Go实现单例模式的几种方式
1,once 方式实现
package main
import (
"sync"
"sync/atomic"
)
//单例模式
type Singleton struct {}
var instance *Singleton
var once sync.Once
var mu sync.Mutex
var initid uint32
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
//使用原子操作
func GetInstanceAtomic() *Singleton {
if instance == nil{
if atomic.LoadUint32(&initid) == 1{
return instance
}
mu.Lock()
defer mu.Unlock()
if instance == nil{
instance = &Singleton{}
atomic.StoreUint32(&initid,1)
}
}
return instance
}
func main() {
}
2,锁+atomic 实现
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
//单例模式atomic 方式实现
var id uint32
type singleton struct {
data string
}
var instance *singleton
var mu sync.Mutex
func GetInstance() *singleton {
if atomic.LoadUint32(&id) == 1{
return instance
}
mu.Lock()
defer mu.Unlock()
if id == 0{
instance = &singleton{
data: "test",
}
fmt.Println("实例化.....")
atomic.StoreUint32(&id,1)
}
return instance
}
func main() {
now := time.Now()
for i :=0;i<10;i++{
int := GetInstance()
fmt.Println(int.data)
}
fmt.Println(time.Since(now))
}

浙公网安备 33010602011771号