MST

星途 面试题库

面试题:Go替代方案在并发场景下的数据一致性

假设你有一个高并发的Go程序,原本使用context传递一些配置数据。现在使用共享变量作为替代方案,你将如何保证在并发读写这些共享变量时的数据一致性?请写出具体的实现代码和同步机制。
28.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用sync包中的工具来保证共享变量在并发读写时的数据一致性。以下是使用sync.Mutex实现的示例代码:

package main

import (
    "fmt"
    "sync"
)

// 定义共享变量
var sharedData int
var mu sync.Mutex

// 模拟高并发写操作
func writeData(wg *sync.WaitGroup, value int) {
    defer wg.Done()
    mu.Lock()
    sharedData = value
    mu.Unlock()
}

// 模拟高并发读操作
func readData(wg *sync.WaitGroup) {
    defer wg.Done()
    mu.Lock()
    fmt.Printf("Read data: %d\n", sharedData)
    mu.Unlock()
}

func main() {
    var wg sync.WaitGroup

    // 启动多个写操作
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go writeData(&wg, i)
    }

    // 启动多个读操作
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go readData(&wg)
    }

    wg.Wait()
}

同步机制说明

  1. sync.Mutex:这是Go语言中最基本的同步原语,用于保证同一时间只有一个goroutine可以访问共享资源。
    • Lock方法:调用该方法时,如果锁可用,则获取锁并继续执行;如果锁已被其他goroutine持有,则阻塞当前goroutine,直到锁可用。
    • Unlock方法:释放锁,允许其他等待的goroutine获取锁。

在上述代码中,通过在读写共享变量sharedData之前调用mu.Lock(),在操作完成后调用mu.Unlock(),确保了在任何时刻只有一个goroutine能够读写sharedData,从而保证了数据一致性。