Go语言协程并发---原子操作

package main

import (
	"fmt"
	"sync/atomic"
)

/*
用原子来替换锁,其主要原因是:
原子操作由底层硬件支持,而锁则由操作系统提供的API实现
若实现相同功能,原子操作通常会更有效率
*/

func main() {
	var a int64 = 123

	//保证将456赋值到a的地址中(期间a一定不会被其他人访问)
	atomic.StoreInt64(&a, 456)
	fmt.Println(a) //456

	a = 123
	new := atomic.AddInt64(&a, 2)
	fmt.Println(a, new) //125 125

	a = 123
	old := atomic.SwapInt64(&a, 456)
	fmt.Println(old, a) //123  456

	a = 123
	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

}

输出:

456
125 125
123 456
true 456
false 321

  

posted @ 2020-04-26 01:28  Ethan_Cheng  阅读(400)  评论(0编辑  收藏  举报