原 4.5-4 并发技术9:原子操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
}

猜你喜欢

转载自blog.csdn.net/u010986776/article/details/86309887