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