MST

星途 面试题库

面试题:Go语言指针在并发场景下的内存安全

假设有一个Go程序,使用多个goroutine对共享内存中的数据(通过指针访问)进行读写操作。请描述可能会出现哪些内存安全问题,如何使用Go语言的特性(如 `sync` 包)来避免这些问题,并给出一个简单的示例代码。
12.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

可能出现的内存安全问题

  1. 竞态条件(Race Condition):多个goroutine同时读写共享内存数据,导致最终结果取决于这些操作的执行顺序,产生不确定的结果。

使用Go语言特性避免问题的方法

  1. 互斥锁(Mutex):使用sync.Mutex来保护共享资源,在访问共享数据前加锁,访问结束后解锁,保证同一时间只有一个goroutine能访问共享数据。
  2. 读写锁(RWMutex):当读操作远多于写操作时,使用sync.RWMutex。读操作可以并发进行,但写操作需要独占访问,以避免数据不一致。

示例代码

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mu    sync.Mutex
)

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    mu.Lock()
    count++
    mu.Unlock()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final count:", count)
}

在上述代码中,mu是一个互斥锁,increment函数在对count进行操作前加锁,操作完成后解锁,确保了多goroutine环境下count的安全访问。