MST

星途 面试题库

面试题:Go指针在并发编程中的注意事项

在Go的并发编程场景下,使用指针会带来哪些潜在的问题?请举例说明如何在并发环境中安全地使用指针,例如使用 `sync.Mutex` 来保护指针指向的数据。
44.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

使用指针在Go并发编程中的潜在问题

  1. 数据竞争:多个goroutine同时读写指针指向的数据时,可能会导致数据竞争。例如:
package main

import (
    "fmt"
)

var data *int

func modifyData() {
    num := 10
    data = &num
}

func readData() {
    if data != nil {
        fmt.Println(*data)
    }
}

func main() {
    go modifyData()
    go readData()
    // 防止程序退出,这里简单sleep,实际中可以用更合适的同步机制
    select {}
}

在这个例子中,modifyDatareadData 两个goroutine同时操作 data 指针指向的数据,可能会引发数据竞争,导致未定义行为。

使用 sync.Mutex 安全使用指针

package main

import (
    "fmt"
    "sync"
)

var data *int
var mu sync.Mutex

func modifyData() {
    num := 10
    mu.Lock()
    data = &num
    mu.Unlock()
}

func readData() {
    mu.Lock()
    if data != nil {
        fmt.Println(*data)
    }
    mu.Unlock()
}

func main() {
    go modifyData()
    go readData()
    // 防止程序退出,这里简单sleep,实际中可以用更合适的同步机制
    select {}
}

在这个改进的代码中,通过 sync.Mutex 来锁定和解锁对 data 指针及其指向数据的操作,确保同一时间只有一个goroutine可以访问或修改指针指向的数据,从而避免数据竞争。