atomic.Load和atomic.Store是Go语言中的原子操作函数,用于实现并发安全的读写操作。
atomic.Load用于原子地读取指定的内存地址的值,保证在读取的过程中不会被其他的goroutine修改。它的函数签名为:func Load(ptr *T) (val T),其中ptr表示要读取的内存地址,val表示读取到的值。
atomic.Store用于原子地写入指定的内存地址的值,保证在写入的过程中不会被其他的goroutine读取。它的函数签名为:func Store(ptr *T, val T),其中ptr表示要写入的内存地址,val表示要写入的值。
下面是一个示例代码,展示了如何使用atomic.Load和atomic.Store:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64
var wg sync.WaitGroup
// 启动10个goroutine进行并发写操作
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
atomic.AddInt64(&counter, 1) // 原子地增加counter的值
wg.Done()
}()
}
wg.Wait() // 等待所有goroutine执行完毕
// 原子地读取counter的值
value := atomic.LoadInt64(&counter)
fmt.Println("Counter:", value)
}
在上面的代码中,我们使用atomic.AddInt64进行并发安全的写操作,每个goroutine对counter进行原子增加操作。然后使用atomic.LoadInt64读取counter的值,保证读取的过程中不会被其他的goroutine修改。
通过使用atomic.Load和atomic.Store,我们可以在并发场景下确保数据的一致性和安全性。