Go语言的原子操作(atomic operations)是一种在多线程环境下保证数据一致性的方法。原子操作是不可中断的,这意味着在执行过程中不会被其他线程干扰。Go语言的sync/atomic
包提供了一系列原子操作函数,可以用于处理整数类型的数据。
以下是一些常见的原子操作及其应用场景:
atomic.LoadInt32
和 atomic.LoadInt64
用于加载原子变量的值。var counter int32
atomic.StoreInt32(&counter, 42)
value := atomic.LoadInt32(&counter)
atomic.StoreInt32
和 atomic.StoreInt64
用于存储原子变量的值。var counter int32
atomic.StoreInt32(&counter, 42)
atomic.AddInt32
和 atomic.AddInt64
用于原子地将一个值加到原子变量上。var counter int32
atomic.AddInt32(&counter, 42)
atomic.CompareAndSwapInt32
和 atomic.CompareAndSwapInt64
用于原子地比较并交换原子变量的值。var counter int32 = 42
if atomic.CompareAndSwapInt32(&counter, 42, 100) {
fmt.Println("Counter was 42, now it's 100")
} else {
fmt.Println("Counter was not 42")
}
atomic.SwapInt32
和 atomic.SwapInt64
用于原子地交换原子变量的值。var counter int32 = 42
atomic.SwapInt32(&counter, 100)
原子操作在以下场景中非常有用:
需要注意的是,原子操作仅适用于简单的数据类型(如整数),对于复杂的数据结构,可能需要使用其他同步原语(如互斥锁、读写锁等)。