Heim  >  Artikel  >  Backend-Entwicklung  >  Wie wird die Lock-in-Golang-Funktion implementiert?

Wie wird die Lock-in-Golang-Funktion implementiert?

PHPz
PHPzOriginal
2024-06-05 12:39:57993Durchsuche

Die Sperren in der Go-Sprache implementieren synchronisierten gleichzeitigen Code, um Datenkonkurrenz zu verhindern: Mutex: Mutex-Sperre, die sicherstellt, dass nur eine Goroutine gleichzeitig die Sperre erhält und zur Steuerung kritischer Abschnitte verwendet wird. RWMutex: Lese-/Schreibsperre, die es mehreren Goroutinen ermöglicht, Daten gleichzeitig zu lesen, aber nur eine Goroutine gleichzeitig Daten schreiben kann. Sie eignet sich für Szenarien, die häufiges Lesen und Schreiben gemeinsam genutzter Daten erfordern.

Wie wird die Lock-in-Golang-Funktion implementiert?

Wie wird die Sperre in der Go-Funktion umgesetzt?

In Go werden Sperren hauptsächlich verwendet, um gleichzeitigen Code zu synchronisieren und Datenkonkurrenz durch gleichzeitigen Zugriff zu verhindern. Die Go-Sprache bietet mehrere Arten von Sperren mit jeweils unterschiedlichen Eigenschaften und Verwendungsszenarien.

sync.Mutex: Mutex-Sperresync.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-Sperre ist die einfachste Sperre, die garantiert, dass nur eine Goroutine gleichzeitig die Sperre erwerben kann. Verwenden Sie Mutex, um den Zugriff auf kritische Abschnitte zu steuern.

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: Lese-/Schreibsperre🎜🎜Mit der Lese-/Schreibsperre können mehrere Goroutinen gleichzeitig Daten lesen, aber nur eine Goroutine gleichzeitig Daten schreiben. Dies ist sehr nützlich für Szenarien, die häufiges Lesen und Schreiben gemeinsam genutzter Daten erfordern. 🎜rrreee

Das obige ist der detaillierte Inhalt vonWie wird die Lock-in-Golang-Funktion implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn