MST
星途 面试题库

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

在Go语言中,假设有一个共享变量用于统计并发环境下的访问次数。请使用原子操作实现对该变量的安全读写,防止竞态条件。并简要说明为什么使用原子操作能提高并发能力。
15.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用 sync/atomic 包来实现对共享变量的安全读写,防止竞态条件。以下是一个示例代码:

package main

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

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

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for j := 0; j < 1000; j++ {
                atomic.AddInt64(&count, 1)
            }
        }()
    }

    wg.Wait()
    fmt.Println("Final count:", atomic.LoadInt64(&count))
}

为什么使用原子操作能提高并发能力:

  1. 避免竞态条件:原子操作是不可分割的操作,在执行过程中不会被其他 goroutine 打断。这就避免了多个 goroutine 同时读写共享变量时出现的数据竞争问题,从而保证了数据的一致性和正确性。
  2. 轻量级同步:与传统的锁机制(如 sync.Mutex)相比,原子操作通常更加轻量级。锁机制在加锁和解锁时可能会涉及到上下文切换等开销,而原子操作直接在硬件层面提供了对共享变量的原子访问,减少了这些额外开销,提高了并发性能。
  3. 适合简单场景:对于简单的计数器、标志位等共享变量的操作,原子操作提供了一种简洁高效的方式来实现并发安全,无需引入复杂的锁机制,代码更加简洁易读。