版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010986776/article/details/86309887
概述
- sync/atomic包下提供了原子操作的系列API
- 官方文档的解释是:
atomic包提供了底层的原子级内存操作,对于同步算法的实现很有用。
这些函数必须谨慎地保证正确使用。除了某些特殊的底层应用,使用通道或者sync包的函数/类型实现同步更好。
应通过通信来共享内存,而不通过共享内存实现通信。
- 它是使用互斥锁进行同步操作的一种替代方案
- 原子操作由底层硬件支持,而锁则由操作系统提供的API实现
- 若实现相同的功能,原子操作通常会更有效率
- 包括对6种基本数据类型的加载、赋值、增减、重新赋值、并发安全地重新赋值5种操作
- 这六种基本数据类型是:int32,int64,uint32,unit64,uintptr,unsafe.Pointer
- 所以原子操作的缺点是:无法支持所有数据类型
API实例
API都非常浅显易懂,其要点是:对基本数据类型的操作效率要由于锁
func main() {
var a int64 = 123
//value := atomic.LoadInt64(&a)
//fmt.Println(value)//123
////保证将456赋值到a的地址中(期间a一定不会被其它人访问)
//atomic.StoreInt64(&a,456)
//fmt.Println(a)//456
// 增减操作
//new := atomic.AddInt64(&a, 2)
//fmt.Println(a,new)//125
// 重新赋值
//old := atomic.SwapInt64(&a, 456)
//fmt.Println(old,a)//123,456
// 确认a没有被并发修改的情况下重新赋值
//swapped := atomic.CompareAndSwapInt64(&a, 123, 456)
//fmt.Println(swapped,a)//true 456
/*模拟a被并发修改了*/
a = 321
//确保a(原值为123)在没有并发修改的情况下被重新赋值为456
swapped := atomic.CompareAndSwapInt64(&a, 123, 456)
fmt.Println(swapped,a)//false 321
}