package mainimport "time"type atomicInt intfunc (a *atomicInt) increment() {*a++
}func (a *atomicInt) get() int {return int(*a)
}
func main() {var a atomicInta.increment()go func() { a.increment() }()time.Sleep(time.Millisecond)println(a)
}

上述代码查看是否存在data race

xushiyundeMBP:atomic xushiyun$ go run -race atomic.go
==================
WARNING: DATA RACE
Read at 0x00c420084000 by main goroutine:
  main.main()
      /Users/xushiyun/go/src/supcon.com/ciruy/learngo/atomic/atomic.go:19 +0xd0

Previous write at 0x00c420084000 by goroutine 5:
  main.main.func1()
      /Users/xushiyun/go/src/supcon.com/ciruy/learngo/atomic/atomic.go:8 +0x54

Goroutine 5 (finished) created at:
  main.main()
      /Users/xushiyun/go/src/supcon.com/ciruy/learngo/atomic/atomic.go:17 +0xb2
==================
2
Found 1 data race(s)
exit status 66

可以看见,程序正常输出结果,但是发现了一处data race,位于8,17,19行,其中两处是对数据实现自增操作,19行是读取操作

加锁之后

package mainimport ("fmt""sync""time"
)//type atomicInt int
type atomicInt struct {value intlock  sync.Mutex
}func (a *atomicInt) increment() {fmt.Println("safe increment")func() {a.lock.Lock()defer a.lock.Unlock()a.value++}()
}func (a *atomicInt) get() int {a.lock.Lock()defer a.lock.Unlock()return a.value
}
func main() {var a atomicInta.increment()go func() { a.increment() }()time.Sleep(time.Millisecond)println(a.get())
}

go语言学习(7)锁相关推荐

  1. 6.方法(go语言学习笔记)

    6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...

  2. go语言学习路线图_开篇:Go 语言的优势与学习路线图

    开篇:Go 语言的优势与学习路线图 由 学院君 创建于1年前, 最后更新于 4个月前 版本号 #5 简介 Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算. ...

  3. Go语言学习之路(二)

    Go语言学习之路(二) 面对对象编程思想 抽象 封装 继承 接口 文件 命令行参数 Json 序列化 反序列化(unmarshal) 单元测试 Redis Redis简介 Redis基本使用 Go连接 ...

  4. 【Go语言 · 学习笔记】

    文章目录 Go语言 · 学习笔记 一.Go包管理 1. 什么是Go语言中的包 2. 包的命名 3. main包 4. 导入包 5. 远程包导入 6. 命名导入 7. 包的init函数 二.Go开发工具 ...

  5. linux基础和C语言学习总结

    自开班以来已经近两个月了,不能说所教知识都掌握得非常好,但至少还是能跟着老师步伐.理解关键知识点.正确完成作业的.现在还没真正开始进入硬件方面的学习,但我相信对基本理论知识及编程开发的牢固掌握是后续深 ...

  6. Go语言学习教程(十一)

    一.结构体指针 * 由于结构体是值类型,在方法传递时希望传递结构体地址,可以使用时结构体指针完成 * 可以结合new(T)函数创建结构体指针 peo := new(People) //因为结构体本质是 ...

  7. 【三万粉丝终极福利】Python、C、Java三大语言学习路线和资源整理

    大家好,我是辣条. 今天给大家带来三万粉丝三大语言学习路线和资源整理,收藏就对了. 目录 C语言 学习路线 学习书籍 学习视频 资源推荐 Java语言 学习路线 学习书籍 学习视频 资源推荐 Pyth ...

  8. go语言学习路线图_2019年最新Go语言学习路线图,三个月带你通关Go语言

    作者:郝林 内容选自:<Go语言核心36讲> 1. 明星大厂热推,岗位需求火热. 最近,Hacker News 发布了 2018 年编程语言的招聘趋势排行榜,其中,Go语言已经反超Java ...

  9. [go 语言学习笔记] 7天用Go从零实现分布式缓存GeeCache 「已完结」

    说明 本文用于记录学习 go 语言过程中的笔记, 文中的代码都是在文本中敲出来的 伪代码, 并不能直接运行, 如有需要可以参考原教程. 本文的整体思路是对原系列教程阅读后的自我思考. 关于本文参考的 ...

  10. Rust太难?那是你没看到这套Rust语言学习万字指南!

    摘要:从开发环境.语法.属性.内存管理和Unicode等五部分,为你带来一份详细的Rust语言学习的精华总结内容. 一.Rust开发环境指南 1.1 Rust代码执行 根据编译原理知识,编译器不是直接 ...

最新文章

  1. IT规划的企业应用实践(10)研究的范围和限制
  2. python 函数进阶_Python学习入门基础:一篇文章搞定函数基础、函数进阶
  3. H5新特性 input type=date 在手机上默认提示显示无效解决办法
  4. caffe框架下目标检测——faster-rcnn实战篇问题集锦
  5. html div 自动聚焦,让DIV也能够获取焦点
  6. 对弈程序基本技术----Alpha-Beta搜索
  7. 【从入门到放弃-Java】并发编程-NIO-Buffer
  8. Numpy之Broadcasting
  9. Maven实战(四)——基于Maven的持续集成实践
  10. JavaScript:屏蔽浏览器右键点击事件
  11. 基于xml的c语言项目,Spring基于XML装配Bean
  12. 国际国家代号mysql_最全的各国 语言(文化)代码与国家地区对照表(国际通用标准形式)...
  13. 解决《Python源码剖析》扫描版PDF字体模糊问题
  14. python编程和excel_Excel Vs. Python?为Excel正名
  15. 驱动大师服务器获取信息失败,360驱动大师、鲁大师,连测硬件信息都不准,我拿什么信你们...
  16. python绘制包络线_包络线和包络谱计算程序
  17. 在iOS微信里如何自动播放
  18. 11n、11ac和11ax速率表
  19. three.js 实现波纹效果
  20. android手机的刷机

热门文章

  1. java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分
  2. linux 批量替换所有文件中包含的字符串
  3. python实现动态规划求解给定矩阵的和最大的子数组(矩阵中数字正负均存在)
  4. sonarqube下安装mysql数据库_本地安装SonarQube之一——win7环境安装mysql
  5. mysql源码如何解析where字句_MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)...
  6. java cxf 入口统一_分分钟带你玩转 Web Services【2】CXF
  7. 【Java从0到架构师,mysql视频教程推荐
  8. 再见SpringMVC!linuxkafka安装单机集群
  9. 逆误差函数:torch.erfinv
  10. python【力扣LeetCode算法题库】69-x 的平方根