亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang安全讀寫(xiě)共享變量的方式詳解

 更新時(shí)間:2024年05月20日 14:47:27   作者:劉鑄緯  
互斥鎖(Mutex)是一種常用的同步原語(yǔ),用于防止多個(gè)協(xié)程同時(shí)訪(fǎng)問(wèn)共享資源,這篇文章主要介紹了Golang安全讀寫(xiě)共享變量的方式,需要的朋友可以參考下

1. 使用互斥鎖(Mutex)

互斥鎖(Mutex)是一種常用的同步原語(yǔ),用于防止多個(gè)協(xié)程同時(shí)訪(fǎng)問(wèn)共享資源。

package main
import (
    "fmt"
    "sync"
)
var (
    counter int
    mutex   sync.Mutex
)
func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    mutex.Lock()
    counter++
    mutex.Unlock()
}
func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final Counter:", counter)
}

2. 使用channel

Go語(yǔ)言的核心理念之一就是“不通過(guò)共享內(nèi)存來(lái)通信,而是通過(guò)通信來(lái)共享內(nèi)存”。我們可以通過(guò)創(chuàng)建一個(gè)channel,然后通過(guò)發(fā)送和接收消息的方式來(lái)讀寫(xiě)共享變量。這種方式在處理并發(fā)問(wèn)題時(shí)非常有用,因?yàn)?code>channel本身就提供了安全性。

package main
import (
    "fmt"
)
func increment(counter chan int, done chan bool) {
    for i := 0; i < 1000; i++ {
        value := <-counter
        value++
        counter <- value
    }
    done <- true
}
func main() {
    counter := make(chan int, 1)
    counter <- 0
    done := make(chan bool)
    for i := 0; i < 10; i++ {
        go increment(counter, done)
    }
    for i := 0; i < 10; i++ {
        <-done
    }
    fmt.Println("Final Counter:", <-counter)
}

3. 讀寫(xiě)鎖(sync.RWMutex)

如果程序中的讀操作遠(yuǎn)多于寫(xiě)操作,那么使用讀寫(xiě)鎖可能會(huì)比互斥鎖更有效率。讀寫(xiě)鎖允許多個(gè)協(xié)程同時(shí)讀取變量,但是只允許同一時(shí)刻只有一個(gè)協(xié)程進(jìn)行寫(xiě)入操作。

package main
import (
    "fmt"
    "sync"
)
var (
    counter int
    rwMutex sync.RWMutex
)
func read(wg *sync.WaitGroup) {
    defer wg.Done()
    rwMutex.RLock()
    fmt.Println("Counter:", counter)
    rwMutex.RUnlock()
}
func write(wg *sync.WaitGroup) {
    defer wg.Done()
    rwMutex.Lock()
    counter++
    rwMutex.Unlock()
}
func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go read(&wg)
    }
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go write(&wg)
    }
    wg.Wait()
}

4. 原子操作(sync/atomic包)

對(duì)于一些簡(jiǎn)單的數(shù)值或者布爾類(lèi)型,我們可以使用原子操作來(lái)讀寫(xiě)共享變量。

package main
import (
    "fmt"
    "sync"
    "sync/atomic"
)
var counter int64
func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    atomic.AddInt64(&counter, 1)
}
func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final Counter:", counter)
}

5. sync.Once

如果共享變量只需要被初始化一次,可以使用sync.Once來(lái)確保初始化的并發(fā)安全性。

package main
import (
    "fmt"
    "sync"
)
var (
    once sync.Once
    initValue int
)
func initialize() {
    fmt.Println("Initializing...")
    initValue = 42
}
func doSomething() {
    once.Do(initialize)
    fmt.Println("Value:", initValue)
}
func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            doSomething()
        }()
    }
    wg.Wait()
}

最后給大家推薦一個(gè)LinuxC/C++高級(jí)架構(gòu)系統(tǒng)教程的學(xué)習(xí)資源與課程,可以幫助你有方向、更細(xì)致地學(xué)習(xí)C/C++后端開(kāi)發(fā),具體內(nèi)容請(qǐng)見(jiàn) https://xxetb.xetslk.com/s/1o04uB

到此這篇關(guān)于Golang安全讀寫(xiě)共享變量的方式的文章就介紹到這了,更多相關(guān)Golang安全讀寫(xiě)共享變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Go語(yǔ)言如何解析帶注釋的json

    詳解Go語(yǔ)言如何解析帶注釋的json

    標(biāo)準(zhǔn)的json格式是不帶注釋?zhuān)怯袝r(shí)候?yàn)榱朔奖憷斫鈐son中各字段的含義,需要支持帶注釋的json,這篇文章主要介紹了Go語(yǔ)言解析帶注釋json的相關(guān)方法,希望對(duì)大家有所幫助
    2024-03-03
  • go kratos源碼及配置解析

    go kratos源碼及配置解析

    這篇文章主要為大家介紹了go kratos源碼及配置解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一文搞懂Golang 時(shí)間和日期相關(guān)函數(shù)

    一文搞懂Golang 時(shí)間和日期相關(guān)函數(shù)

    這篇文章主要介紹了Golang 時(shí)間和日期相關(guān)函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 淺析Go語(yǔ)言中數(shù)組的使用

    淺析Go語(yǔ)言中數(shù)組的使用

    數(shù)組用于在單個(gè)變量中存儲(chǔ)相同類(lèi)型的多個(gè)值,而不是為每個(gè)值聲明單獨(dú)的變量,這篇文章主要為大家介紹了Go語(yǔ)言中數(shù)組的簡(jiǎn)單使用,需要?的可以參考下
    2023-08-08
  • 詳解Go strconv包

    詳解Go strconv包

    Go語(yǔ)言中strconv包實(shí)現(xiàn)了基本數(shù)據(jù)類(lèi)型和其字符串表示的相互轉(zhuǎn)換。這篇文章主要介紹了Go strconv包的相關(guān)知識(shí),需要的朋友可以參考下
    2020-10-10
  • golang 微服務(wù)之gRPC與Protobuf的使用

    golang 微服務(wù)之gRPC與Protobuf的使用

    這篇文章主要介紹了golang 微服務(wù)之gRPC與Protobuf的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Golang利用Recover進(jìn)行錯(cuò)誤處理

    Golang利用Recover進(jìn)行錯(cuò)誤處理

    Golang?中的?recover?是一個(gè)鮮為人知但非常有趣和強(qiáng)大的功能,這篇文章小編就來(lái)帶大家深入了解一下在Golang中是如何利用Recover進(jìn)行錯(cuò)誤處理吧
    2023-12-12
  • 使用Go語(yǔ)言實(shí)現(xiàn)LRU緩存的代碼詳解

    使用Go語(yǔ)言實(shí)現(xiàn)LRU緩存的代碼詳解

    在日常開(kāi)發(fā)中,緩存是提高系統(tǒng)性能的重要手段,LRU緩存是一種基于“最近最少使用”策略的緩存系統(tǒng),其目的是在空間受限的情況下保留最新、最常用的數(shù)據(jù),本文將詳細(xì)講解如何使用?Go?語(yǔ)言實(shí)現(xiàn)一個(gè)?LRU?緩存,需要的朋友可以參考下
    2024-11-11
  • Go語(yǔ)言中使用gorm小結(jié)

    Go語(yǔ)言中使用gorm小結(jié)

    這篇文章主要給大家介紹了Go語(yǔ)言中如何使用gorm,文中介紹的很詳細(xì),有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Go錯(cuò)誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法

    Go錯(cuò)誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法

    這篇文章主要介紹了Go錯(cuò)誤處理之panic函數(shù)使用及捕獲,本篇探討了如何使用 panic 和 recover 來(lái)處理 Go 語(yǔ)言中的異常,需要的朋友可以參考下
    2023-03-03

最新評(píng)論