golang 阿里面试题

发布时间:2024-07-07 15:37:17

作为一名专业的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中的互斥锁有所帮助。

相关推荐