Go 語言中的鎖定實現同步並發程式碼,防止資料競爭:Mutex:互斥鎖,保證同一時間只有一個 goroutine 取得鎖,用於臨界區控制。 RWMutex:讀寫鎖,允許多個 goroutine 同時讀取數據,但僅一個 goroutine 同時寫入數據,適用於需要頻繁讀寫共享數據的場景。
在 Go 中,鎖定主要用於同步並發程式碼,防止並發存取引起的資料競爭。 Go 語言提供了多種類型的鎖,每種類型都有不同的特性和使用場景。
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
:讀取寫入鎖定讀取寫入鎖定允許多個 goroutine 同時讀取數據,但僅允許一個 goroutine 同時寫入資料。這對於需要頻繁讀寫共享資料的場景非常有用。
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() }
以上是golang函式中的鎖是如何實現的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!