Go 互斥锁的使用
2023-03-18
Go 语言通过 sync 包的互斥锁实现并发安全,使用 Lock 和 Unlock 方法控制对共享资源的访问,确保同一时间只有一个 goroutine 操作该资源。
Go 语言中可以使用 sync 包提供的互斥锁来实现并发安全。互斥锁是一种同步机制,它可以保持在同一时间只能有一个 goroutine 访问共享资源。
互斥锁的常用方法有两个:Lock 和 Unlock,分别用于锁定和解锁互斥锁。
假设有一个共享资源 number,多个 goroutine 都需要访问它,那么可以使用互斥锁来保证并发安全,示例代码如下:
import "sync"
var (
mu sync.Mutex
number int
)
// 累加函数
func add() {
mu.Lock()
number++
mu.Unlock()
}
// 读取函数
func read() int {
mu.Lock()
defer mu.Unlock()
return number
}
在 add 函数中,首先使用 Lock 方法锁定互斥锁,然后对共享资源进行操作,最后使用 Unlock 方法解锁互斥锁。这样可以保证同一时间只有一个 goroutine 对共享资源进行操作。
在 read 函数中,在通过 Lock 方法锁定互斥锁之后使用了 defer 语句来在函数返回前自动执行 Unlock 方法。这样可以保证即使函数中出现了错误,也会正确地解锁互斥锁,避免了死锁的情况。
在使用互斥锁时,应该尽量减少临界区的长度,避免因为等待锁而引起的性能问题。