MST

星途 面试题库

面试题:Go语言中原子操作提升并发性能之基础运用

在Go语言中,假设你有一个多协程读写的共享变量,使用原子操作包`atomic`中的`AddInt64`函数来实现对该变量的安全加法操作,请写出相应代码,并解释为什么使用原子操作能提升并发性能。
42.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

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

func main() {
    var num int64
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            atomic.AddInt64(&num, 1)
        }()
    }
    wg.Wait()
    fmt.Println("最终结果:", num)
}

使用原子操作能提升并发性能的原因如下:

  • 避免锁开销:在并发编程中,传统的方式是使用锁(如sync.Mutex)来保护共享变量,以防止竞态条件。然而,锁的使用会带来额外的开销,例如加锁和解锁的操作。每次加锁和解锁都需要CPU上下文切换,这在高并发场景下会显著降低性能。而原子操作是CPU级别的操作,它不需要像锁那样进行上下文切换,直接在硬件层面保证了操作的原子性,所以性能更高。
  • 无死锁风险:使用锁时,如果加锁和解锁的顺序不正确,或者在嵌套锁的情况下,很容易产生死锁问题。一旦发生死锁,程序就会陷入停滞,所有相关的协程都无法继续执行。原子操作由于不需要锁,不存在这种死锁风险,因此在并发环境下更加可靠,也间接提升了性能。