MST

星途 面试题库

面试题:Go中Goroutine并发安全问题之资源竞争

在Go语言中,当多个Goroutine同时访问和修改共享资源时,可能会出现资源竞争问题。请描述一个简单场景,说明这种资源竞争是如何发生的,并给出使用`sync.Mutex`解决该问题的示例代码。
25.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

资源竞争场景描述

假设有一个简单的计数器程序,多个Goroutine同时对这个计数器进行累加操作。由于多个Goroutine并发执行,可能会出现一个Goroutine读取计数器的值,还未进行累加操作时,另一个Goroutine也读取了相同的值,导致最终结果不准确,这就是资源竞争问题。

使用sync.Mutex解决资源竞争问题示例代码

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
    numGoroutines := 1000

    for i := 0; i < numGoroutines; i++ {
        wg.Add(1)
        go increment(&wg)
    }

    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

在上述代码中:

  1. counter是共享资源,即需要被多个Goroutine访问和修改的变量。
  2. mu是一个sync.Mutex实例,用于保护共享资源counter
  3. increment函数中,通过mu.Lock()加锁,保证在同一时间只有一个Goroutine可以访问和修改counter,操作完成后通过mu.Unlock()解锁。
  4. main函数中,启动1000个Goroutine并发执行increment函数,等待所有Goroutine执行完毕后,输出最终的计数器值,这样可以确保计数器值的准确性,避免资源竞争问题。