Go学习笔记—锁(sync包)
并发安全和锁
1. sync.Mutex—实现互斥锁
var lock sync.Mutex
var x int
func add() { //这样,在多个goroutine同时访问x时,才不会造成x错误for i := 0; i < 5000; i++ {lock.Lock() // 加锁x = x + 1lock.Unlock() // 解锁}
}
2. sync.RWMutex—实现读写互斥锁
读写锁分为两种:读锁和写锁。当一个goroutine获取读锁之后,其他的goroutine如果是获取读锁会继续获得锁,如果是获取写锁就会等待;当一个goroutine获取写锁之后,其他的goroutine无论是获取读锁还是写锁都会等待。
var rwlock sync.RWMutex
rwlock.Lock() // 加写锁
rwlock.Unlock() // 解写锁
rwlock.RLock() // 加读锁
rwlock.RUnlock() // 解读锁
3. sync.WaitGroup—实现并发任务的同步
sync.WaitGroup返回一个非引用类型对象(维护一个计数器,计数器为0时,Wait()才会让函数继续向下运行)
func f(i int, wg *sync.WaitGroup) {fmt.Println(i)wg.Done() //Done每次将计数器-1
}func main() {wg := sync.WaitGroup{}wg.Add(100) //计数器初值设置为100for i := 0; i < 100; i++ {go f(i, &wg) //开启一个并行线程}wg.Wait() //计数器为0时才会继续运行后续程序,否则拦截
}
4. sync.Once—实现唯一初始化
var once sync.Once
once.Do(初始化函数); //do实际上就是互斥锁+布尔变量,保证这个方法只会被安全的执行一次//例如下面我们使用Once实现单例模式:
type singleton struct {}var instance *singleton
var once sync.Oncefunc GetInstance() *singleton {once.Do(func() {instance = &singleton{}})return instance
}
5. sync.Map—实现并发安全的Map
操作 | 作用 |
---|---|
var m = sync.Map{} | 初始化 |
m.Store(key, n) | 存入键值对 |
value, _ := m.Load(key) | 取出键值对 |
Delete(key) | 删除键值对 |
6. sync/atomic—实现原子操作
函数 | 作用 |
---|---|
func AddInt32(addr *int32, delta int32) (new int32) | 加操作 |
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool) | 比较old==new,为否则将new存入addr |
func SwapInt32(addr *int32, new int32) (old int32) | 直接将new存入addr |
func LoadInt32(addr *int32) (val int32) | 读取addr下的变量值 |
func StoreInt32(addr *int32, val int32) | 将val存入addr下 |
Go学习笔记—锁(sync包)相关推荐
- 《Go语言圣经》学习笔记 第十章 包和工具
<Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...
- R语言可视化学习笔记之ggridges包绘制山峦图
作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...
- R语言可视化学习笔记之ggridges包
作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...
- 影像组学视频学习笔记(27)-SimpleITK包介绍、Li‘s have a solution and plan.
本笔记来源于B站Up主: 有Li 的影像组学的系列教学视频 本节(27)主要讲解: 功能强大的图像处理工具SimpleITK包 视频中李博士演示了SimpleITK的两个基本功能:图像格式转换以及图像 ...
- ROS学习笔记之——robot_localization包
之前博客已经介绍过robot_pose_ekf功能包以及(extended)kalman滤波的原理< ROS学习笔记之--EKF (Extended Kalman Filter) node 扩展 ...
- Python数据分析三剑客学习笔记Day6——matplotlib包的使用:数据可视化,简单绘制柱状图、曲线图、饼图、频率分布直方图
本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...
- Python数据分析三剑客学习笔记Day3——pandas包的使用:认识series类型,DataFrame类型,读取excel表格数据及数据操作
本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...
- 【安全牛学习笔记】抓包嗅探
┃抓包嗅探 ┃Windows ┃ Wireshark ┃ Omnipeek ┃ commview ┃ Sniffpass ┃Linux ┃ Tcpdump ┃ Wi ...
- Netty4 学习笔记之三-粘包和拆包
名词解释 粘包: 会将消息粘粘起来发送.类似吃米饭,一口吃多个饭粒,而不是一粒一粒的吃. 拆包: 会将消息拆开,分为多次接受.类似喝饮料,一口一口的喝,而不是一口气喝完. 简单的来说: 多次发送较少内 ...
最新文章
- android碎片调用动态碎片,Android Training - 使用碎片创建一个动态UI
- openFeign 服务接口的调用03—— OpenFeign 超时控制
- localhost,127.0.0.1 与 本机IP的区别
- 张正友标定法 【计算机视觉学习笔记--双目视觉几何框架系列】
- 英法德三门语言同时达到c1,【分享】插翅而飞的孩子(转载)
- 工厂模式 + 反射 ?= 灵活多变的数据库
- JavaScript中带示例的字符串search()方法
- 英特尔CEO称他们相信到2030年,芯片将占到汽车成本20%
- Win-MASM64汇编语言-and/or指令
- go及IDE LiteIDE的安装及环境变量配置
- 2022保研经验帖——吉大、华师、浙大、中大、南航/理、东南、南开等
- 物理机、虚拟机、云服务器三者的区别
- python爬取豆瓣书籍_Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
- Linux df du 命令
- 程序员实用工具和网站(转)
- 含文档+PPT+源码等]精品微信小程序慢性疾病+后台管理系统|前后分离VUE[包运行成功]
- 360“隔离沙箱”强劲升级:运行软件不中毒
- 你愿意为了一个更整洁的收件箱付款99美元吗?
- 原型设计工具即时设计、Axure、Figma、Sketch,哪个更好用?
- 水流法敷设光缆技术的研究与应用