MST

星途 面试题库

面试题:Go闭包在并发场景下的行为分析

假设在Go语言的并发编程场景中使用闭包,闭包内部引用了一个外部变量。请分析在多个goroutine同时执行该闭包时,可能会出现什么问题?如何避免这些问题?并通过代码示例进行说明。
41.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

在多个goroutine同时执行引用了外部变量的闭包时,可能会出现数据竞争问题。因为多个goroutine可能同时读写这个外部变量,导致程序出现不可预测的结果。

避免方法

  1. 使用互斥锁(sync.Mutex):通过互斥锁来保护对共享变量的访问,确保同一时间只有一个goroutine能够访问该变量。
  2. 使用通道(channel):通过通道在goroutine之间传递数据,避免共享变量。

代码示例

使用互斥锁

package main

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    counter := 0

    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            mu.Lock()
            counter++
            mu.Unlock()
        }()
    }
    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

使用通道

package main

import (
    "fmt"
)

func main() {
    counterCh := make(chan int)
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            counterCh <- 1
        }()
    }

    go func() {
        wg.Wait()
        close(counterCh)
    }()

    counter := 0
    for val := range counterCh {
        counter += val
    }
    fmt.Println("Final counter value:", counter)
}