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

  

Go语言协程并发---原子操作的更多相关文章

  1. Go语言协程并发---管道信号量应用

    package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...

  2. Go语言协程并发---互斥锁sync.Mutex

    package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...

  3. Go语言协程并发---条件变量

    package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bit ...

  4. Go语言协程并发---读写锁sync.RWMutex

    package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...

  5. Go语言协程并发---等待组sync.WaitGroup

    package main import ( "fmt" "sync" "time" ) /*等待组API介绍*/ func main071( ...

  6. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  7. Go语言协程并发---timer秒表与定时器

    秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...

  8. Go语言协程并发---select多路复用应用

    package main import ( "fmt" "time" ) /* ·循环从一写两读三条管道中随机选择一条能走的路 ·等所有路都走不通了就退出循环 ...

  9. python3通过gevent.pool限制协程并发数量

    协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错.最好的方法通过限制协程并发数量来解决此类问题. server代码: #!/usr/bin/env python # -*- codi ...

随机推荐

  1. Co-prime(容斥原理)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  2. windows黑窗口命令笔记

    windows有个黑窗口,吃惊吧!意外吧!! 哈哈,我是真的有些吃惊的!! nslookup ipconfig /all ipconfig /flushdns windows 声音修复 windows ...

  3. SPOJ 2713 线段树(sqrt)

    题意:       给你n个数(n <= 100000),然后两种操作,0 x y :把x-y的数全都sqrt ,1 x y:输出 x-y的和. 思路:       直接线段树更新就行了,对于当 ...

  4. IIS7.5配置对PHP的支持

    以下环境是 Windows server2008R2 IIS7.5 一般情况下,windows server系统默认是仅支持IIS+asp 或 IIS+aspx 的 搭配的,但是有时候我们的网站程序是 ...

  5. Github镜像网站

    https://hub.fastgit.org

  6. C#事件总线

    目录 简介 实现事件总线 定义事件基类 定义事件参数基类 定义EventBus 使用事件总线 事件及事件参数 定义发布者 定义订阅者 实际使用 总结 参考资料 简介 事件总线是对发布-订阅模式的一种实 ...

  7. LINQ之方法语法

    上节讲到使用linq的查询关键字进行查询,这节讲一下linq查询的另一种方式--linq方法. 使用linq方法语法,必须要会用lambda表达式,配合lambda表达式才能体会到linq的优雅便捷. ...

  8. web.xml常用配置详解

    web.xml常用配置详解 context-param 指定 ServletContext(上下文) 配置文件路径,基本配置一般是Spring配置文件,或者是spring-security的配置文件. ...

  9. 逆向工程初步160个crackme-------3

    这个Crackme3 涉及到浮点指令以及浮点数的存储与运算,我没学习过浮点指令,不得不从网上恶补了1个小时,一边看汇编指令一边百度其指令含义. 回头得好好补补这方面的知识了,太菜了! 我大致了解了一下 ...

  10. 03.21 ICPC训练联盟周赛:UCF Local Programming Contest 2018正式赛

    B Breaking Branches 题意:两个人比赛折枝,谁剩下最后1,无法折出整数即为输 思路:树枝长n,若是奇数,则Bob胜出,若是偶数,则Alice胜出,且需要输出1: 1 #include ...