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))
}

  

posted @ 2021-01-22 12:45  pebblecome  阅读(263)  评论(0)    收藏  举报