ホームページ  >  記事  >  バックエンド開発  >  golang関数のロックはどのように実装されていますか?

golang関数のロックはどのように実装されていますか?

PHPz
PHPzオリジナル
2024-06-05 12:39:57993ブラウズ

Go 言語のロックは、データ競合を防ぐために同期された同時実行コードを実装します。 Mutex: Mutex ロック。同時に 1 つのゴルーチンだけがロックを取得することを保証し、クリティカル セクションの制御に使用されます。 RWMutex: 複数の goroutine が同時にデータを読み取ることを許可する読み取り/書き込みロック。ただし、同時にデータを書き込むことができるのは 1 つの goroutine のみです。共有データの頻繁な読み取りと書き込みが必要なシナリオに適しています。

golang関数のロックはどのように実装されていますか?

Go 関数のロックはどのように実装されていますか?

Go では、ロックは主に同時コードを同期し、同時アクセスによって引き起こされるデータ競合を防ぐために使用されます。 Go 言語では複数の種類のロックが提供されており、それぞれに異なる特性と使用シナリオがあります。

sync.Mutex: Mutex ロック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

Mutex ロックは最も基本的なロックであり、同時に 1 つの goroutine のみがロックを取得できることを保証します。 Mutex を使用して重要なセクションへのアクセスを制御します。

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

sync.RWMutex: 読み取り/書き込みロック🎜🎜読み取り/書き込みロックでは、複数のゴルーチンが同時にデータを読み取ることができますが、同時にデータを書き込むことができるのは 1 つのゴルーチンのみです。これは、共有データの頻繁な読み取りと書き込みが必要なシナリオに非常に役立ちます。 🎜りー

以上がgolang関数のロックはどのように実装されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。