>  기사  >  백엔드 개발  >  golang 함수의 잠금은 어떻게 구현됩니까?

golang 함수의 잠금은 어떻게 구현됩니까?

PHPz
PHPz원래의
2024-06-05 12:39:571039검색

Go 언어의 잠금은 데이터 경쟁을 방지하기 위해 동기화된 동시 코드를 구현합니다. 뮤텍스: 뮤텍스 잠금은 동시에 하나의 고루틴만 잠금을 획득하도록 보장하며 중요한 섹션 제어에 사용됩니다. RWMutex: 여러 고루틴이 동시에 데이터를 읽을 수 있도록 허용하지만 동시에 하나의 고루틴만 데이터를 쓸 수 있는 읽기-쓰기 잠금입니다. 공유 데이터를 자주 읽고 써야 하는 시나리오에 적합합니다.

golang 함수의 잠금은 어떻게 구현됩니까?

Go 기능의 잠금은 어떻게 구현되나요?

Go에서 잠금은 주로 동시 코드를 동기화하고 동시 액세스로 인한 데이터 경쟁을 방지하는 데 사용됩니다. Go 언어는 각각 특성과 사용 시나리오가 다른 여러 유형의 잠금을 제공합니다.

sync.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를 사용하세요.

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: 읽기-쓰기 잠금🎜🎜읽기-쓰기 잠금을 사용하면 여러 고루틴이 동시에 데이터를 읽을 수 있지만 동시에 하나의 고루틴만 데이터를 쓸 수 있습니다. 이는 공유 데이터를 자주 읽고 써야 하는 시나리오에 매우 유용합니다. 🎜아아아아

위 내용은 golang 함수의 잠금은 어떻게 구현됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.