go语言学习(7)锁
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)锁相关推荐
- 6.方法(go语言学习笔记)
6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...
- go语言学习路线图_开篇:Go 语言的优势与学习路线图
开篇:Go 语言的优势与学习路线图 由 学院君 创建于1年前, 最后更新于 4个月前 版本号 #5 简介 Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算. ...
- Go语言学习之路(二)
Go语言学习之路(二) 面对对象编程思想 抽象 封装 继承 接口 文件 命令行参数 Json 序列化 反序列化(unmarshal) 单元测试 Redis Redis简介 Redis基本使用 Go连接 ...
- 【Go语言 · 学习笔记】
文章目录 Go语言 · 学习笔记 一.Go包管理 1. 什么是Go语言中的包 2. 包的命名 3. main包 4. 导入包 5. 远程包导入 6. 命名导入 7. 包的init函数 二.Go开发工具 ...
- linux基础和C语言学习总结
自开班以来已经近两个月了,不能说所教知识都掌握得非常好,但至少还是能跟着老师步伐.理解关键知识点.正确完成作业的.现在还没真正开始进入硬件方面的学习,但我相信对基本理论知识及编程开发的牢固掌握是后续深 ...
- Go语言学习教程(十一)
一.结构体指针 * 由于结构体是值类型,在方法传递时希望传递结构体地址,可以使用时结构体指针完成 * 可以结合new(T)函数创建结构体指针 peo := new(People) //因为结构体本质是 ...
- 【三万粉丝终极福利】Python、C、Java三大语言学习路线和资源整理
大家好,我是辣条. 今天给大家带来三万粉丝三大语言学习路线和资源整理,收藏就对了. 目录 C语言 学习路线 学习书籍 学习视频 资源推荐 Java语言 学习路线 学习书籍 学习视频 资源推荐 Pyth ...
- go语言学习路线图_2019年最新Go语言学习路线图,三个月带你通关Go语言
作者:郝林 内容选自:<Go语言核心36讲> 1. 明星大厂热推,岗位需求火热. 最近,Hacker News 发布了 2018 年编程语言的招聘趋势排行榜,其中,Go语言已经反超Java ...
- [go 语言学习笔记] 7天用Go从零实现分布式缓存GeeCache 「已完结」
说明 本文用于记录学习 go 语言过程中的笔记, 文中的代码都是在文本中敲出来的 伪代码, 并不能直接运行, 如有需要可以参考原教程. 本文的整体思路是对原系列教程阅读后的自我思考. 关于本文参考的 ...
- Rust太难?那是你没看到这套Rust语言学习万字指南!
摘要:从开发环境.语法.属性.内存管理和Unicode等五部分,为你带来一份详细的Rust语言学习的精华总结内容. 一.Rust开发环境指南 1.1 Rust代码执行 根据编译原理知识,编译器不是直接 ...
最新文章
- IT规划的企业应用实践(10)研究的范围和限制
- python 函数进阶_Python学习入门基础:一篇文章搞定函数基础、函数进阶
- H5新特性 input type=date 在手机上默认提示显示无效解决办法
- caffe框架下目标检测——faster-rcnn实战篇问题集锦
- html div 自动聚焦,让DIV也能够获取焦点
- 对弈程序基本技术----Alpha-Beta搜索
- 【从入门到放弃-Java】并发编程-NIO-Buffer
- Numpy之Broadcasting
- Maven实战(四)——基于Maven的持续集成实践
- JavaScript:屏蔽浏览器右键点击事件
- 基于xml的c语言项目,Spring基于XML装配Bean
- 国际国家代号mysql_最全的各国 语言(文化)代码与国家地区对照表(国际通用标准形式)...
- 解决《Python源码剖析》扫描版PDF字体模糊问题
- python编程和excel_Excel Vs. Python?为Excel正名
- 驱动大师服务器获取信息失败,360驱动大师、鲁大师,连测硬件信息都不准,我拿什么信你们...
- python绘制包络线_包络线和包络谱计算程序
- 在iOS微信里如何自动播放
- 11n、11ac和11ax速率表
- three.js 实现波纹效果
- android手机的刷机
热门文章
- java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分
- linux 批量替换所有文件中包含的字符串
- python实现动态规划求解给定矩阵的和最大的子数组(矩阵中数字正负均存在)
- sonarqube下安装mysql数据库_本地安装SonarQube之一——win7环境安装mysql
- mysql源码如何解析where字句_MySQL解析器源码分析--对select语句中子查询处理逻辑的分析(一)...
- java cxf 入口统一_分分钟带你玩转 Web Services【2】CXF
- 【Java从0到架构师,mysql视频教程推荐
- 再见SpringMVC!linuxkafka安装单机集群
- 逆误差函数:torch.erfinv
- python【力扣LeetCode算法题库】69-x 的平方根