Bagaimanakah fungsi kunci dalam golang dilaksanakan?

PHPz
Lepaskan: 2024-06-05 12:39:57
asal
990 orang telah melayarinya

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()
}
Salin selepas log masuk

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()
}
Salin selepas log masuk
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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!