Go 言語のロックは、データ競合を防ぐために同期された同時実行コードを実装します。 Mutex: Mutex ロック。同時に 1 つのゴルーチンだけがロックを取得することを保証し、クリティカル セクションの制御に使用されます。 RWMutex: 複数の goroutine が同時にデータを読み取ることを許可する読み取り/書き込みロック。ただし、同時にデータを書き込むことができるのは 1 つの goroutine のみです。共有データの頻繁な読み取りと書き込みが必要なシナリオに適しています。
Go では、ロックは主に同時コードを同期し、同時アクセスによって引き起こされるデータ競合を防ぐために使用されます。 Go 言語では複数の種類のロックが提供されており、それぞれに異なる特性と使用シナリオがあります。
sync.Mutex
: 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
: 読み取り/書き込みロック🎜🎜読み取り/書き込みロックでは、複数のゴルーチンが同時にデータを読み取ることができますが、同時にデータを書き込むことができるのは 1 つのゴルーチンのみです。これは、共有データの頻繁な読み取りと書き込みが必要なシナリオに非常に役立ちます。 🎜りー以上がgolang関数のロックはどのように実装されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。