发布时间:2024-12-23 02:57:47
作为一名专业的golang开发者,我们经常会遇到各种面试题,而阿里作为国内最大的互联网公司之一,其面试题自然也是多种多样。其中就有一道非常经典的golang面试题,今天我就来给大家详细解答一下。
在分布式系统中,经常会有多个goroutine同时访问某个共享变量的情况。由于goroutine的执行是异步的,所以在多个goroutine同时访问共享变量时,可能产生竞争条件,导致程序出现不可预知的错误。
假设我们有一个全局变量count,初始值为0。现在有100个goroutine同时对其进行累加,每次累加1。请问,100个goroutine累加1000次后,count的最终值是多少?
在golang中,我们可以使用sync包提供的互斥锁来解决并发访问共享变量的问题。互斥锁是一种最简单、最常用的控制并发访问的方法,在同一时刻,只能有一个goroutine进入临界区,其他goroutine则需要等待。
首先,我们需要定义一个互斥锁:
var m sync.Mutex
然后,在每个goroutine对count进行累加操作前,我们需要先获取锁,保证同一时刻只有一个goroutine能够进入临界区:
m.Lock()
在累加完成后,需释放锁:
m.Unlock()
接下来,我们使用一个循环来创建100个goroutine,并进行1000次的累加操作:
const N = 100
const M = 1000
func main() {
var count int
var wg sync.WaitGroup
m := sync.Mutex{}
for i := 0; i < N; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < M; j++ {
m.Lock()
count++
m.Unlock()
}
}()
}
wg.Wait()
fmt.Println("Final count:", count)
}
在上述代码中,我们使用了sync.WaitGroup来等待所有goroutine执行完成。同时,在goroutine内部使用defer关键字来确保每个goroutine执行完成后都会减少WaitGroup的计数。
最终,我们可以得到count的最终值为100000。
以上就是我对阿里golang面试题的解答,通过使用互斥锁,我们成功解决了并发访问共享变量的问题,并保证了程序的正确性。希望这篇文章能对大家理解golang中的互斥锁有所帮助。