Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah fungsi kunci dalam golang dilaksanakan?

Bagaimanakah fungsi kunci dalam golang dilaksanakan?

PHPz
PHPzasal
2024-06-05 12:39:57991semak imbas

Kunci dalam bahasa Go melaksanakan kod serentak yang disegerakkan untuk mengelakkan persaingan data: Mutex: Mutex lock, memastikan hanya satu goroutine memperoleh kunci pada masa yang sama, digunakan untuk kawalan bahagian kritikal. RWMutex: Kunci baca-tulis, yang membolehkan berbilang goroutin membaca data pada masa yang sama, tetapi hanya satu goroutine boleh menulis data pada masa yang sama Ia sesuai untuk senario yang memerlukan pembacaan dan penulisan data yang kerap.

Bagaimanakah fungsi kunci dalam golang dilaksanakan?

Bagaimanakah penguncian dalam fungsi Go dilaksanakan?

Dalam Go, kunci digunakan terutamanya untuk menyegerakkan kod serentak dan menghalang persaingan data yang disebabkan oleh akses serentak. Bahasa Go menyediakan berbilang jenis kunci, setiap satu dengan ciri dan senario penggunaan yang berbeza.

sync.Mutex: Kunci Mutexsync.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

Kunci Mutex ialah kunci paling asas, yang menjamin bahawa hanya satu goroutine boleh memperoleh kunci pada masa yang sama. Gunakan Mutex untuk mengawal akses kepada bahagian kritikal.

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: Kunci baca-tulis🎜🎜Kunci baca-tulis membenarkan berbilang goroutin membaca data pada masa yang sama, tetapi hanya membenarkan satu goroutine menulis data pada masa yang sama. Ini sangat berguna untuk senario yang memerlukan pembacaan dan penulisan data yang dikongsi dengan kerap. 🎜rreeee

Atas ialah kandungan terperinci Bagaimanakah fungsi kunci dalam golang dilaksanakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn