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

Go語(yǔ)言?xún)?yōu)雅實(shí)現(xiàn)單例模式的多種方式

 更新時(shí)間:2025年02月06日 08:20:36   作者:燭陰  
單例模式(Singleton Pattern)是一種設(shè)計(jì)模式,旨在保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并且提供全局訪(fǎng)問(wèn)點(diǎn),單例模式通常用于需要限制某個(gè)對(duì)象的實(shí)例數(shù)量為一個(gè)的場(chǎng)景,本文給大家介紹了Go語(yǔ)言實(shí)現(xiàn)單例模式的多種方式,需要的朋友可以參考下

單例模式的基本定義

單例模式(Singleton Pattern)是一種設(shè)計(jì)模式,旨在保證一個(gè)類(lèi)只有一個(gè)實(shí)例,并且提供全局訪(fǎng)問(wèn)點(diǎn)。單例模式通常用于需要限制某個(gè)對(duì)象的實(shí)例數(shù)量為一個(gè)的場(chǎng)景,比如數(shù)據(jù)庫(kù)連接池、日志管理器、配置管理器等。

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

1. 線(xiàn)程安全的懶漢式單例

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

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

// Singleton 類(lèi)型
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í)例
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			s1 := GetInstance()
			fmt.Printf("index %d, memery address: %p\n", index, s1)
		}(i)

	}
	wg.Wait()
}

結(jié)果

index 0, memery address: 0x56c480
index 5, memery address: 0x56c480
index 4, memery address: 0x56c480
index 2, memery address: 0x56c480
index 7, memery address: 0x56c480
index 9, memery address: 0x56c480
index 6, memery address: 0x56c480
index 8, memery address: 0x56c480
index 3, memery address: 0x56c480
index 1, memery address: 0x56c480

解析:

  • sync.Once:Go標(biāo)準(zhǔn)庫(kù)提供的一個(gè)同步原語(yǔ),確保某個(gè)函數(shù)只會(huì)被調(diào)用一次。它在并發(fā)情況下保證了線(xiàn)程安全。
  • once.Do:此方法確保傳入的函數(shù)只執(zhí)行一次,適用于懶加載單例實(shí)例。

2. 雙重檢查鎖定(DCL)

雙重檢查鎖定是一種優(yōu)化方式,它通過(guò)在兩次檢查實(shí)例時(shí),減少了加鎖的開(kāi)銷(xiāo),提高了性能。

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

// Singleton 類(lèi)型
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í)例
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			s1 := GetInstance()
			fmt.Printf("index %d, memery address: %p\n", index, s1)
		}(i)

	}
	wg.Wait()
}

解析:

  • 雙重檢查:第一次檢查實(shí)例是否為 nil,如果是,則加鎖。然后再次檢查實(shí)例是否為 nil,如果是則創(chuàng)建實(shí)例。
  • 鎖的優(yōu)化:只有在實(shí)例尚未創(chuàng)建時(shí)才會(huì)加鎖,避免了每次獲取實(shí)例時(shí)都需要加鎖的性能損耗。

3. 原子操作法

Go 語(yǔ)言的 sync/atomic 包提供了原子操作,我們可以利用它來(lái)確保單例的線(xiàn)程安全。

package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"unsafe"
)

var wg sync.WaitGroup

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í)例
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			s1 := GetInstance()
			fmt.Printf("index %d, memery address: %p\n", index, s1)
		}(i)

	}
	wg.Wait()
}

解析:

  • unsafe.Pointer:在Go中,unsafe.Pointer 可以用來(lái)繞過(guò)類(lèi)型系統(tǒng),直接處理內(nèi)存地址。通過(guò)原子操作確保實(shí)例賦值的安全性。
  • atomic.LoadPointeratomic.StorePointer:原子加載和存儲(chǔ)指針,確保操作的線(xiàn)程安全性。

總結(jié)

在Go語(yǔ)言中實(shí)現(xiàn)單例模式有多種方式,最常見(jiàn)的是使用 sync.Once、雙重檢查鎖定(DCL)和原子操作法。每種方法有其優(yōu)缺點(diǎn),選擇合適的方式可以幫助你在保證線(xiàn)程安全的前提下優(yōu)化性能。

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

相關(guān)文章

  • Golang通道阻塞情況與通道無(wú)阻塞實(shí)現(xiàn)小結(jié)

    Golang通道阻塞情況與通道無(wú)阻塞實(shí)現(xiàn)小結(jié)

    本文主要介紹了Golang通道阻塞情況與通道無(wú)阻塞實(shí)現(xiàn)小結(jié),詳細(xì)解析了通道的類(lèi)型、操作方法以及垃圾回收機(jī)制,從基礎(chǔ)概念到高級(jí)應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Go 實(shí)現(xiàn)HTTP中間人代理的操作

    Go 實(shí)現(xiàn)HTTP中間人代理的操作

    這篇文章主要介紹了Go 實(shí)現(xiàn)HTTP中間人代理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 詳解Go 1.22 for循環(huán)的兩處重要更新

    詳解Go 1.22 for循環(huán)的兩處重要更新

    這篇文章主要詳細(xì)介紹了Go 1.22 for循環(huán)的兩處重要更新,Go 1.22 版本于 2024 年 2 月 6 日發(fā)布,引入了幾個(gè)重要的特性和改進(jìn),在語(yǔ)言層面上,這個(gè)版本對(duì) for 循環(huán)進(jìn)行了兩處更新,本文將會(huì)對(duì) for 循環(huán)的兩個(gè)更新進(jìn)行介紹,需要的朋友可以參考下
    2024-02-02
  • 關(guān)于golang中平行賦值淺析

    關(guān)于golang中平行賦值淺析

    這篇文章主要給大家介紹了關(guān)于golang中平行賦值的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Go語(yǔ)言讀取txt文檔的操作方法

    Go語(yǔ)言讀取txt文檔的操作方法

    Go語(yǔ)言提供了很多文件操作的支持,在不同場(chǎng)景下,有對(duì)應(yīng)的處理方式,本節(jié)我們來(lái)介紹一下Go語(yǔ)言讀取txt文檔的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)示例代碼

    在?Go?語(yǔ)言中,您可以使用?os/exec?包來(lái)執(zhí)行外部命令,不通過(guò)調(diào)用?shell,并且能夠獲得進(jìn)程的退出碼、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出,下面給大家分享golang封裝一個(gè)執(zhí)行命令行的函數(shù)(return?stderr/stdout/exitcode)的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • 教你一分鐘配置好Go語(yǔ)言開(kāi)發(fā)環(huán)境(多種操作系統(tǒng))

    教你一分鐘配置好Go語(yǔ)言開(kāi)發(fā)環(huán)境(多種操作系統(tǒng))

    在這篇文章中,我們從頭到尾一步步指導(dǎo)你配置Golang開(kāi)發(fā)環(huán)境,并編寫(xiě)你的第一個(gè)"Hello,?World!"程序,我們?cè)敿?xì)解釋了在多種操作系統(tǒng)(包括Windows、Linux和macOS)下的安裝過(guò)程、環(huán)境變量設(shè)置以及如何驗(yàn)證安裝是否成功
    2023-09-09
  • Go連接數(shù)據(jù)庫(kù)操作基礎(chǔ)講解

    Go連接數(shù)據(jù)庫(kù)操作基礎(chǔ)講解

    這篇文章主要為大家介紹了Go連接數(shù)據(jù)庫(kù)操作基礎(chǔ)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go工具鏈之go tool cover使用方法和示例詳解

    Go工具鏈之go tool cover使用方法和示例詳解

    go tool cover是Go工具鏈中的一個(gè)命令,作用是分析測(cè)試用例的代碼覆蓋率,本文將對(duì)go tool cover 作用,使用方法和使用場(chǎng)景作一個(gè)簡(jiǎn)單的介紹,感興趣的同學(xué)可以參考閱讀一下
    2023-07-07
  • golang之?dāng)?shù)據(jù)驗(yàn)證validator的實(shí)現(xiàn)

    golang之?dāng)?shù)據(jù)驗(yàn)證validator的實(shí)現(xiàn)

    這篇文章主要介紹了golang之?dāng)?shù)據(jù)驗(yàn)證validator的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論