MST

星途 面试题库

面试题:Go语言中原子操作在并发场景下的应用

在Go语言的并发编程场景中,经常会用到原子操作来保证数据的一致性。请说明如何使用原子操作包(`sync/atomic`)中的`AddInt64`函数来实现多个协程安全地对一个`int64`类型的变量进行加法操作,并给出示例代码。同时解释为什么在这种场景下不能直接使用普通的变量自增操作?
13.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用AddInt64实现多个协程安全加法操作
    • 在Go语言中,sync/atomic包提供了原子操作函数,AddInt64用于对int64类型的变量进行原子加法操作。
    • 示例代码如下:
package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

func main() {
    var num int64
    var wg sync.WaitGroup
    // 启动10个协程
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 每个协程对num执行1000次加法操作
            for j := 0; j < 1000; j++ {
                atomic.AddInt64(&num, 1)
            }
        }()
    }
    // 等待所有协程完成
    wg.Wait()
    fmt.Println("最终结果:", num)
}
  1. 不能直接使用普通变量自增操作的原因
    • 在并发场景下,普通的变量自增操作(如num++)不是原子操作。它实际上包含了读取变量值、增加1、再写回变量这三个步骤。
    • 当多个协程同时执行num++时,可能会出现竞态条件。例如,两个协程同时读取到num的值为10,然后各自增加1,最后写回的结果都是11,而不是预期的12。
    • atomic.AddInt64函数是原子操作,它能保证在多协程环境下对int64变量的加法操作是线程安全的,不会出现竞态条件,从而保证数据的一致性。