MST

星途 面试题库

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

在Go语言中,假设我们有一个计数器变量,在多协程环境下需要对其进行原子操作以保证并发安全。请编写一段代码实现该计数器的原子增加和读取操作,并解释使用到的原子操作函数的原理。
11.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

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

func main() {
    var counter int64
    var wg sync.WaitGroup

    // 启动10个协程
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 原子增加操作
            atomic.AddInt64(&counter, 1)
        }()
    }

    // 等待所有协程完成
    wg.Wait()

    // 原子读取操作
    value := atomic.LoadInt64(&counter)
    fmt.Printf("Final counter value: %d\n", value)
}

原子操作函数原理:

  1. atomic.AddInt64
    • 作用:对int64类型的变量进行原子性的加法操作。
    • 原理:它通过硬件层面的原子指令(如x86架构下的LOCK前缀指令)来确保在多处理器环境下,该操作是不可分割的。当多个协程同时调用atomic.AddInt64对同一个变量进行操作时,硬件会保证每次只有一个操作能成功执行,其他操作必须等待,从而避免了竞态条件。
  2. atomic.LoadInt64
    • 作用:原子性地读取int64类型变量的值。
    • 原理:同样利用硬件层面的原子指令,保证在读取变量值时,不会受到其他协程对该变量写操作的干扰,确保读取到的值是完整且一致的。