面试题答案
一键面试在多协程读写共享变量的场景中,atomic.Store
和 atomic.Load
函数用于保证数据一致性。atomic.Store
用于安全地存储值到共享变量,atomic.Load
用于安全地从共享变量读取值。这两个函数通过底层硬件指令确保操作的原子性,避免竞态条件。
以下是一个简单的Go语言代码示例:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var sharedVar int64
var wg sync.WaitGroup
// 启动10个协程进行写操作
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
value := int64(id * 10)
atomic.StoreInt64(&sharedVar, value)
fmt.Printf("协程 %d 存储值: %d\n", id, value)
}(i)
}
// 启动10个协程进行读操作
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
value := atomic.LoadInt64(&sharedVar)
fmt.Printf("协程 %d 读取值: %d\n", id, value)
}(i)
}
wg.Wait()
}
在这个示例中:
atomic.StoreInt64
函数用于将值安全地存储到sharedVar
中。atomic.LoadInt64
函数用于安全地从sharedVar
读取值。sync.WaitGroup
用于等待所有协程完成操作,确保程序不会提前退出。
这样通过 atomic.Store
和 atomic.Load
函数,在多协程环境中保证了共享变量 sharedVar
的数据一致性。