MST

星途 面试题库

面试题:Go中原子操作如何保障类型安全

请简要阐述在Go语言中,原子操作是怎样确保类型安全的,并举一个简单的示例说明原子操作对类型安全保障的作用。
47.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

原子操作确保类型安全的原理

在Go语言中,原子操作通过底层硬件指令来保证对共享变量的操作是原子的,即不可分割、不会被其他并发操作打断。这避免了在多线程环境下,由于多个goroutine同时读写同一变量而导致的数据竞争问题,从而确保类型安全。例如,对一个int类型的变量进行自增操作,如果不是原子操作,在多线程环境下可能出现读到旧值、修改后写回,导致最终结果错误的情况。而原子操作保证了这个自增操作在硬件层面是一个整体,不会被其他操作干扰。

示例

package main

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

func main() {
    var counter int64
    var wg sync.WaitGroup
    numRoutines := 1000

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

    wg.Wait()
    fmt.Printf("Final counter value: %d\n", counter)
}

在这个示例中,多个goroutine同时对counter变量进行自增操作。如果使用普通的counter++,会产生数据竞争问题,最终结果可能小于1000。而使用atomic.AddInt64原子操作,确保了每次自增操作的原子性,从而保证了类型安全,最终counter的值为1000。