面试题答案
一键面试基本原理
互斥锁(sync.Mutex
)的基本原理是通过限制同一时间只有一个goroutine能够访问共享资源,从而防止竞态条件。当一个goroutine获取了互斥锁,其他试图获取该互斥锁的goroutine会被阻塞,直到该goroutine释放锁。这样就确保了在任何时刻,共享变量最多只有一个goroutine在进行读写操作,避免了多个goroutine同时读写导致的数据不一致问题。
代码实现方式
package main
import (
"fmt"
"sync"
)
var (
sharedVar int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
sharedVar++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
numGoroutines := 1000
for i := 0; i < numGoroutines; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Printf("Final value of sharedVar: %d\n", sharedVar)
}
在上述代码中:
- 定义了一个共享变量
sharedVar
和一个互斥锁mu
。 increment
函数用于对共享变量进行自增操作。在操作共享变量前,先调用mu.Lock()
获取锁,操作完成后调用mu.Unlock()
释放锁。- 在
main
函数中,创建了1000个goroutine并发执行increment
函数,并通过sync.WaitGroup
等待所有goroutine执行完毕。最后输出共享变量的最终值。通过这种方式,确保了在高并发场景下对共享变量的安全访问。