欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言實(shí)現(xiàn)單例模式的多種方法

 更新時(shí)間:2025年07月29日 10:55:33   作者:喜歡代碼的新之助  
單例模式是一種創(chuàng)建型設(shè)計(jì)模式,Go中常見(jiàn)實(shí)現(xiàn)包括使用sync.Once、雙重檢查鎖定和原子操作法,每種方法都有其獨(dú)特的優(yōu)點(diǎn)和適用場(chǎng)景,下面就來(lái)具體介紹一下

單例模式的基本定義

單例模式(Singleton Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,其核心思想在于確保一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)。該模式廣泛應(yīng)用于需要嚴(yán)格控制對(duì)象數(shù)量的場(chǎng)景,諸如數(shù)據(jù)庫(kù)連接池、日志管理器、配置管理器等。

Go語(yǔ)言中的單例模式實(shí)現(xiàn)

在Go語(yǔ)言中,實(shí)現(xiàn)單例模式有多種方法,以下介紹幾種常見(jiàn)且線程安全的實(shí)現(xiàn)方式:

1. 線程安全的懶漢式單例

懶漢式實(shí)現(xiàn)會(huì)延遲實(shí)例的創(chuàng)建,直到首次調(diào)用時(shí)才會(huì)實(shí)例化對(duì)象。為了保證并發(fā)安全,我們使用sync.Once來(lái)確保實(shí)例只被創(chuàng)建一次。

package main
 
import (
	"fmt"
	"sync"
)
 
var wg sync.WaitGroup
 
// Singleton 結(jié)構(gòu)體定義
type Singleton struct{}
 
var instance *Singleton
var once sync.Once
 
// GetInstance 返回全局唯一的實(shí)例
func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{}
	})
	return instance
}
 
func main() {
	// 獲取單例實(shí)例并打印內(nèi)存地址
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			s1 := GetInstance()
			fmt.Printf("index %d, memory address: %p\n", index, s1)
		}(i)
	}
	wg.Wait()
}

解析

  • sync.Once:確保傳入的函數(shù)只執(zhí)行一次,適用于懶加載單例實(shí)例。
  • once.Do:確保實(shí)例的創(chuàng)建操作只執(zhí)行一次,且線程安全。

2. 雙重檢查鎖定(DCL)

雙重檢查鎖定通過(guò)兩次檢查實(shí)例狀態(tài),減少了加鎖的開(kāi)銷,提高了性能。

package main
 
import (
	"fmt"
	"sync"
)
 
var wg sync.WaitGroup
 
// Singleton 結(jié)構(gòu)體定義
type Singleton struct{}
 
var instance *Singleton
var lock sync.Mutex
 
func GetInstance() *Singleton {
	if instance == nil {
		lock.Lock()
		defer lock.Unlock()
		if instance == nil {
			instance = &Singleton{}
		}
	}
	return instance
}
 
func main() {
	// 獲取單例實(shí)例并打印內(nèi)存地址
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			s1 := GetInstance()
			fmt.Printf("index %d, memory address: %p\n", index, s1)
		}(i)
	}
	wg.Wait()
}

解析

  • 雙重檢查:第一次無(wú)鎖檢查避免不必要的加鎖開(kāi)銷,第二次加鎖檢查確保實(shí)例安全創(chuàng)建。
  • 鎖優(yōu)化:僅在實(shí)例尚未創(chuàng)建時(shí)加鎖,提高了性能。

3. 原子操作法

利用sync/atomic包提供的原子操作,確保單例的線程安全。

package main
 
import (
	"fmt"
	"sync"
	"sync/atomic"
	"unsafe"
)
 
var wg sync.WaitGroup
 
// Singleton 結(jié)構(gòu)體定義
type Singleton struct{}
 
var instance unsafe.Pointer
 
func GetInstance() *Singleton {
	// 使用原子操作獲取實(shí)例
	if atomic.LoadPointer(&instance) == nil {
		newInstance := &Singleton{}
		atomic.StorePointer(&instance, unsafe.Pointer(newInstance))
	}
	return (*Singleton)(atomic.LoadPointer(&instance))
}
 
func main() {
	// 獲取單例實(shí)例并打印內(nèi)存地址
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			s1 := GetInstance()
			fmt.Printf("index %d, memory address: %p\n", index, s1)
		}(i)
	}
	wg.Wait()
}

解析

  • unsafe.Pointer:用于直接處理內(nèi)存地址,繞過(guò)類型系統(tǒng)。
  • atomic.LoadPointeratomic.StorePointer:原子加載和存儲(chǔ)指針,確保線程安全。

總結(jié)

在Go語(yǔ)言中,實(shí)現(xiàn)單例模式有多種方法,包括使用sync.Once、雙重檢查鎖定和原子操作法。每種方法都有其獨(dú)特的優(yōu)點(diǎn)和適用場(chǎng)景。選擇哪種方法取決于具體需求,如性能要求、代碼簡(jiǎn)潔性等。在實(shí)際應(yīng)用中,可以根據(jù)具體場(chǎng)景權(quán)衡利弊,選擇最合適的實(shí)現(xiàn)方式。

到此這篇關(guān)于Go語(yǔ)言實(shí)現(xiàn)單例模式的多種方法的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器的示例詳解

    Golang實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)簡(jiǎn)單http服務(wù)器,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定的幫助,需要的可以參考一下
    2023-03-03
  • Windows下安裝VScode 并使用及中文配置方法

    Windows下安裝VScode 并使用及中文配置方法

    這篇文章主要介紹了Windows下安裝VScode 并使用及中文配置的方法詳解,本文通過(guò)圖文并茂的形式給大家介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 深入淺出Go語(yǔ)言:手把手教你高效生成與解析JSON數(shù)據(jù)

    深入淺出Go語(yǔ)言:手把手教你高效生成與解析JSON數(shù)據(jù)

    本文將帶你一步步走進(jìn)Go語(yǔ)言的世界,教你如何高效生成與解析JSON數(shù)據(jù),無(wú)論你是初學(xué)者還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,都能在本文中找到實(shí)用的技巧和靈感,本文內(nèi)容簡(jiǎn)潔明了,示例豐富,讓你在閱讀的過(guò)程中輕松掌握Go語(yǔ)言生成與解析JSON數(shù)據(jù)的技巧,需要的朋友可以參考下
    2024-02-02
  • golang判斷結(jié)構(gòu)體為空的問(wèn)題

    golang判斷結(jié)構(gòu)體為空的問(wèn)題

    這篇文章主要介紹了golang判斷結(jié)構(gòu)體為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Golang對(duì)sqlite3數(shù)據(jù)庫(kù)進(jìn)行操作實(shí)踐記錄

    Golang對(duì)sqlite3數(shù)據(jù)庫(kù)進(jìn)行操作實(shí)踐記錄

    sqlite是嵌入式關(guān)系型數(shù)據(jù)庫(kù)引擎,官方描述為自包含的、無(wú)服務(wù)的、零配置并支持事務(wù)的關(guān)系型數(shù)據(jù)庫(kù)引擎,下面這篇文章主要給大家介紹了關(guān)于Golang對(duì)sqlite3數(shù)據(jù)庫(kù)進(jìn)行操作的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Golang?Makefile示例深入講解使用

    Golang?Makefile示例深入講解使用

    一次偶然的機(jī)會(huì),在?github?上看到有人用?Makefile,就嘗試了一下,發(fā)現(xiàn)真的非常合適,Makefile?本身就是用來(lái)描述依賴的,可讀性非常好,而且與強(qiáng)大的?shell?結(jié)合在一起,基本可以實(shí)現(xiàn)任何想要的功能
    2023-01-01
  • 超實(shí)用的Golang通道指南之輕松實(shí)現(xiàn)并發(fā)編程

    超實(shí)用的Golang通道指南之輕松實(shí)現(xiàn)并發(fā)編程

    Golang?中的通道是一種高效、安全、靈活的并發(fā)機(jī)制,用于在并發(fā)環(huán)境下實(shí)現(xiàn)數(shù)據(jù)的同步和傳遞。本文主要介紹了如何利用通道輕松實(shí)現(xiàn)并發(fā)編程,需要的可以參考一下
    2023-04-04
  • Golang實(shí)現(xiàn)IO操作

    Golang實(shí)現(xiàn)IO操作

    本文主要介紹了Golang實(shí)現(xiàn)IO操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • 快速上手GO的net/http包

    快速上手GO的net/http包

    本文主要介紹了快速上手GO的net/http包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-05-05
  • golang使用grpc+go-kit模擬oauth認(rèn)證的操作

    golang使用grpc+go-kit模擬oauth認(rèn)證的操作

    這篇文章主要介紹了golang使用grpc+go-kit模擬oauth認(rèn)證的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04

最新評(píng)論