package main;

import (
"sync/atomic"
"fmt"
"sync"
) //atomic包提供了底层的原子级内存操作
//类型共有六种:int32, int64, uint32, uint64, uintptr, unsafe.Pinter
//操作共五种:增减, 比较并交换, 载入, 存储,交换 func main() { //增减操作
var a int32;
fmt.Println("a : ", a);
//函数名以Add为前缀,加具体类型名
//参数一,是指针类型
//参数二,与参数一类型总是相同
//增操作
new_a := atomic.AddInt32(&a, 3);
fmt.Println("new_a : ", new_a);
//减操作
new_a = atomic.AddInt32(&a, -2);
fmt.Println("new_a : ", new_a); //CAS(Compare And Swap)比较并交换操作
//函数名以CompareAndSwap为前缀,并具体类型名
var b int32;
fmt.Println("b : ", b);
//函数会先判断参数一指向的值与参数二是否相等,如果相等,则用参数三替换参数一的值。
//最后返回是否替换成功
atomic.CompareAndSwapInt32(&b, 0, 3);
fmt.Println("b : ", b); //载入操作
//当我们对某个变量进行读取操作时,可能该变量正在被其他操作改变,或许我们读取的是被修改了一半的数据。
//所以我们通过Load这类函数来确保我们正确的读取
//函数名以Load为前缀,加具体类型名
var c int32;
wg := sync.WaitGroup{};
//我们启100个goroutine
for i := 0; i < 100; i++ {
wg.Add(1);
go func() {
defer wg.Done();
tmp := atomic.LoadInt32(&c);
if !atomic.CompareAndSwapInt32(&c, tmp, (tmp + 1)) {
fmt.Println("c 修改失败");
}
}();
}
wg.Wait();
//c的值有可能不等于100,频繁修改变量值情况下,CAS操作有可能不成功。
fmt.Println("c : ", c); //存储操作
//与载入函数相对应,提供原子的存储函数
//函数名以Store为前缀,加具体类型名
var d int32;
fmt.Println("d : ", d);
//存储某个值时,任何CPU都不会都该值进行读或写操作
//存储操作总会成功,它不关心旧值是什么,与CAS不同
atomic.StoreInt32(&d, 666);
fmt.Println("d : ", d); //交换操作
//直接设置新值,返回旧值,与CAS不同,它不关心旧值。
//函数名以Swap为前缀,加具体类型名
var e int32;
wg2 := sync.WaitGroup{};
//我们启10个goroutine
for i := 0; i < 10; i++ {
wg2.Add(1);
go func() {
defer wg2.Done();
tmp := atomic.LoadInt32(&e);
old := atomic.SwapInt32(&e, (tmp + 1));
fmt.Println("e old : ", old);
}();
}
wg2.Wait();
fmt.Println("e : ", e);
}

  

golang语言中sync/atomic包的学习与使用的更多相关文章

  1. golang语言中os/signal包的学习与使用

    package main; import ( "os" "os/signal" "fmt" ) //signal包中提供了两个函数 //No ...

  2. golang语言中os/user包的学习与使用

    package main; import ( "os/user" "fmt" ) func main() { //返回当前用户的结构 u, _ := user. ...

  3. golang语言中os/exec包的学习与使用

    package main; import ( "os/exec" "fmt" "io/ioutil" "bytes" ) ...

  4. go语言中os/signal包的学习与使用

    package main; import ( "os" "os/signal" "fmt" ) //signal包中提供了两个函数 //No ...

  5. php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的

    原文呢:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict Onl ...

  6. golang中的原子操作atomic包

    1. 概念 原子操作 atomic 包 加锁操作涉及到内核态的上下文切换,比较耗时,代价高, 针对基本数据类型我们还可以使用原子操作来保证并发的安全, 因为原子操作是go语言提供的方法,我们在用户态就 ...

  7. golang语言中os包的学习与使用(文件,目录,进程的操作)

    os中一些常用函数的使用: package main; import ( "os" "fmt" "time" "strings&q ...

  8. go语言中sync包和channel机制

    文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go&quo ...

  9. golang语言中bytes包的常用函数,Reader和Buffer的使用

    bytes中常用函数的使用: package main; import ( "bytes" "fmt" "unicode" ) //byte ...

随机推荐

  1. mysql主从复制搭建中几种log和pos详解

    一.主从原理 Replication 线程   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...

  2. jQuery图片延迟加载插件:jquery.lazyload

    ----------------------------------------------------------------------------------------------- clas ...

  3. ArcGIS模型构建器案例教程-批量修改工作空间所有要素类的空间参考

    ArcGIS模型构建器案例教程-批量修改工作空间所有要素类的空间参考 目的:批量修改工作空间所有要素类的空间参考(坐标系) 工具名称:WorkspaceChangeSpatialReference 使 ...

  4. ArcGIS案例学习笔记3_1_地理配准案例_目视找点

    ArcGIS案例学习笔记3_1_地理配准案例_目视找点 计划时间:第3天上午 方法:地理配准/添加链接点/左键/右键/输入坐标 数据:江苏省.zip 矢量:省界,市界,GPS WGS84 地理坐标系 ...

  5. 关于网上“强大的vim”矫正!!

    参考链接在这里: 强大的vim配置文件,让编程更随意 - ma6174 - 博客园, http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393. ...

  6. js 乘法 4.39*100 出现值不对问题解决

    https://www.jianshu.com/p/a026245661bb //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显. ...

  7. windows下搭建vue

    1.windows https://nodejs.org/en/download/ 下载安装包2.点击安装 安装完成3.进入cmd npm -v4.安装淘宝镜像cnpm npm下载速度过慢因为安装完n ...

  8. 大型运输行业实战_day01_1_业务分析

    1.业务分析 发展历史:  上车收费-->车站买票(相当于先收钱后上车)-->站务系统--->联网售票 2.项目结构 3.开发流程分析 1.业务分析            图文并茂  ...

  9. Java中字节流如何转字符流,OutputStreamWriter用法

    OutputStreamWriter 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:UTF-8: 步骤: 1.创建流 子类对象  绑定数 ...

  10. Appium1.6 GUI界面介绍

    Appium1.6安装详见随笔:http://www.cnblogs.com/meitian/p/7360017.html   下面具体介绍一下GUI界面 1.appium server配置页面 2. ...