面试题答案
一键面试1. atomic.Value确保数据一致性原理
atomic.Value
通过以下方式确保多协程访问时数据的一致性:
- 原子操作:
atomic.Value
使用底层的原子操作来保证对值的加载(Load
)和存储(Store
)是原子性的。这意味着在多协程环境下,这些操作不会被其他协程干扰,要么完整执行,要么不执行。 - 类型限制:
atomic.Value
只能存储和加载interface{}
类型的值。在存储新值时,它会先将新值转换为interface{}
,然后通过原子操作将其存储到内部的存储位置。加载时,再从存储位置原子地加载interface{}
值,并可转换回实际类型。这种类型的统一处理避免了因不同类型值的存储和加载方式不同而可能导致的不一致问题。
2. 示例代码
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var v atomic.Value
v.Store(0)
var wg sync.WaitGroup
numRoutines := 10
for i := 0; i < numRoutines; i++ {
wg.Add(1)
go func() {
defer wg.Done()
current := v.Load().(int)
atomic.StoreInt64((*int64)(¤t), int64(current+1))
v.Store(current)
}()
}
wg.Wait()
fmt.Println("Final value:", v.Load())
}
在上述代码中:
- 首先创建了一个
atomic.Value
实例v
,并初始化为0
。 - 开启了
10
个协程,每个协程从atomic.Value
中加载当前值,对其加1
,然后再存储回atomic.Value
。 - 使用
sync.WaitGroup
等待所有协程完成操作,最后输出atomic.Value
中的最终值。这样可以确保在多协程并发访问时,atomic.Value
中数据的一致性。