首頁 >後端開發 >Golang >golang函式中的鎖是如何實現的?

golang函式中的鎖是如何實現的?

PHPz
PHPz原創
2024-06-05 12:39:571065瀏覽

Go 語言中的鎖定實現同步並發程式碼,防止資料競爭:Mutex:互斥鎖,保證同一時間只有一個 goroutine 取得鎖,用於臨界區控制。 RWMutex:讀寫鎖,允許多個 goroutine 同時讀取數據,但僅一個 goroutine 同時寫入數據,適用於需要頻繁讀寫共享數據的場景。

golang函式中的鎖是如何實現的?

Go 函數中的鎖定是如何實現的?

在 Go 中,鎖定主要用於同步並發程式碼,防止並發存取引起的資料競爭。 Go 語言提供了多種類型的鎖,每種類型都有不同的特性和使用場景。

sync.Mutex:互斥鎖

互斥鎖是一種最基本的鎖,它保證在同一時間只有一個 goroutine 可以取得鎖。使用 Mutex 可以實現對臨界區的存取控制。

package main

import (
    "fmt"
    "sync"
)

var counter int
var mutex sync.Mutex

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 500; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            mutex.Lock()
            counter++
            fmt.Printf("Counter: %d\n", counter)
            mutex.Unlock()
        }()
    }
    wg.Wait()
}

sync.RWMutex:讀取寫入鎖定

讀取寫入鎖定允許多個 goroutine 同時讀取數據,但僅允許一個 goroutine 同時寫入資料。這對於需要頻繁讀寫共享資料的場景非常有用。

package main

import (
    "fmt"
    "sync"
)

type BankAccount struct {
    balance int
    sync.RWMutex
}

func (b *BankAccount) Deposit(amount int) {
    b.Lock()
    defer b.Unlock()
    b.balance += amount
}

func (b *BankAccount) Withdraw(amount int) {
    b.Lock()
    defer b.Unlock()
    b.balance -= amount
}

func (b *BankAccount) Balance() int {
    b.RLock()
    defer b.RUnlock()
    return b.balance
}

func main() {
    var wg sync.WaitGroup
    bankAccount := BankAccount{balance: 100}

    for i := 0; i < 500; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            bankAccount.Deposit(10)
        }()
    }

    for i := 0; i < 500; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            bankAccount.Withdraw(10)
        }()
    }

    fmt.Println(bankAccount.Balance())
    wg.Wait()
}

以上是golang函式中的鎖是如何實現的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn