在 Go 语言中,sync.Mutex
是一个用于实现互斥锁的结构,能够帮助你在并发环境中保护共享资源,以防止数据竞争。以下是关于 sync.Mutex
的一些基本信息和使用示例。
基本概念
- 互斥锁:确保同一时间只有一个 goroutine 可以访问共享资源。
- Lock 方法:用于请求锁定,如果锁已被其他 goroutine 持有,则当前 goroutine 会阻塞,直到锁可用。
- Unlock 方法:释放锁,允许其他 goroutine 访问被保护的资源。
使用示例
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex // 创建一个互斥锁
)
func increment(wg *sync.WaitGroup) {
defer wg.Done() // 完成时通知 WaitGroup
mu.Lock() // 请求锁定
counter++ // 修改共享资源
mu.Unlock() // 释放锁
}
func main() {
var wg sync.WaitGroup
// 启动多个 goroutine
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait() // 等待所有 goroutine 完成
fmt.Println("Final counter value:", counter)
}
重要注意事项
- 死锁:确保每个
Lock
都有对应的Unlock
,否则会导致死锁。 - 性能:尽量缩小锁的范围,避免在持有锁的情况下进行长时间的操作,以提高性能。
- 使用
defer
:在锁定后立即使用defer
释放锁可以保证即使发生错误也能正确释放锁。
通过使用 sync.Mutex
,你可以安全地管理并发访问共享数据,避免数据竞争和不一致性的问题。