goroutine atomic
原子性操作:
指的是在并发环境下不可被中断的操作。它确保在执行过程中不会被其他线程或 goroutine 打断,从而避免数据竞争和不一致的问题。
对原生类型变量,使用原子方法进行原子操作
在 Go 中,sync/atomic 包提供了一些原子操作,用于对整数、指针等进行线程安全的读写。这些操作包括:
atomic.AddInt32/atomic.AddInt64: 原子地增加整数。atomic.LoadInt32/atomic.LoadInt64: 原子地读取整数。atomic.StoreInt32/atomic.StoreInt64: 原子地写入整数。atomic.CompareAndSwapInt32/atomic.CompareAndSwapInt64: 原子地比较并交换整数。
这些操作在底层是通过硬件指令实现的,保证在多线程环境下的安全性。
示例
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int32
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddInt32(&counter, 1)
}()
}
wg.Wait()
fmt.Printf("Counter: %d\n", counter)
}
在这个例子中,atomic.AddInt32 确保了对 counter 的增操作是线程安全的。