面试题答案
一键面试原子操作确保类型安全的原理
在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。