面试题答案
一键面试互斥锁工作原理
- 基本概念:互斥锁(
sync.Mutex
)是一种同步原语,它通过限制同一时间只有一个 goroutine 能够访问共享资源,从而避免资源竞争。 - 锁定机制:当一个 goroutine 调用互斥锁的
Lock
方法时,如果此时互斥锁处于未锁定状态,该 goroutine 会立即获取锁并将其锁定,其他试图获取锁的 goroutine 会被阻塞,直到该锁被解锁。 - 解锁机制:当持有锁的 goroutine 调用互斥锁的
Unlock
方法时,互斥锁会被解锁,此时等待队列中的一个 goroutine 会被唤醒并获取锁,继续执行。
正确使用互斥锁保护共享资源的代码示例
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
在上述代码中:
- 声明互斥锁和共享资源:声明了一个共享变量
counter
和一个sync.Mutex
类型的互斥锁mu
。 - 使用互斥锁保护共享资源:在
increment
函数中,在访问和修改counter
之前调用mu.Lock()
获取锁,操作完成后调用mu.Unlock()
释放锁,确保同一时间只有一个 goroutine 能修改counter
。 - 并发执行:在
main
函数中,启动 1000 个 goroutine 并发调用increment
函数,通过sync.WaitGroup
等待所有 goroutine 执行完毕,最后输出counter
的最终值,确保结果的正确性。