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