并发安全和锁

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包)相关推荐

  1. 《Go语言圣经》学习笔记 第十章 包和工具

    <Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...

  2. R语言可视化学习笔记之ggridges包绘制山峦图

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...

  3. R语言可视化学习笔记之ggridges包

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 严涛老师的绘图教程还有: gganimate |诺奖文章里面的动图绘制教程来了!! ggplot2学习笔记之 ...

  4. 影像组学视频学习笔记(27)-SimpleITK包介绍、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学的系列教学视频 本节(27)主要讲解: 功能强大的图像处理工具SimpleITK包 视频中李博士演示了SimpleITK的两个基本功能:图像格式转换以及图像 ...

  5. ROS学习笔记之——robot_localization包

    之前博客已经介绍过robot_pose_ekf功能包以及(extended)kalman滤波的原理< ROS学习笔记之--EKF (Extended Kalman Filter) node 扩展 ...

  6. Python数据分析三剑客学习笔记Day6——matplotlib包的使用:数据可视化,简单绘制柱状图、曲线图、饼图、频率分布直方图

    本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...

  7. Python数据分析三剑客学习笔记Day3——pandas包的使用:认识series类型,DataFrame类型,读取excel表格数据及数据操作

    本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...

  8. 【安全牛学习笔记】抓包嗅探

    ┃抓包嗅探 ┃Windows ┃    Wireshark ┃    Omnipeek ┃    commview ┃    Sniffpass ┃Linux ┃    Tcpdump ┃    Wi ...

  9. Netty4 学习笔记之三-粘包和拆包

    名词解释 粘包: 会将消息粘粘起来发送.类似吃米饭,一口吃多个饭粒,而不是一粒一粒的吃. 拆包: 会将消息拆开,分为多次接受.类似喝饮料,一口一口的喝,而不是一口气喝完. 简单的来说: 多次发送较少内 ...

最新文章

  1. android碎片调用动态碎片,Android Training - 使用碎片创建一个动态UI
  2. openFeign 服务接口的调用03—— OpenFeign 超时控制
  3. localhost,127.0.0.1 与 本机IP的区别
  4. 张正友标定法 【计算机视觉学习笔记--双目视觉几何框架系列】
  5. 英法德三门语言同时达到c1,【分享】插翅而飞的孩子(转载)
  6. 工厂模式 + 反射 ?= 灵活多变的数据库
  7. JavaScript中带示例的字符串search()方法
  8. 英特尔CEO称他们相信到2030年,芯片将占到汽车成本20%
  9. Win-MASM64汇编语言-and/or指令
  10. go及IDE LiteIDE的安装及环境变量配置
  11. 2022保研经验帖——吉大、华师、浙大、中大、南航/理、东南、南开等
  12. 物理机、虚拟机、云服务器三者的区别
  13. python爬取豆瓣书籍_Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
  14. Linux df du 命令
  15. 程序员实用工具和网站(转)
  16. 含文档+PPT+源码等]精品微信小程序慢性疾病+后台管理系统|前后分离VUE[包运行成功]
  17. 360“隔离沙箱”强劲升级:运行软件不中毒
  18. 你愿意为了一个更整洁的收件箱付款99美元吗?
  19. 原型设计工具即时设计、Axure、Figma、Sketch,哪个更好用?
  20. 水流法敷设光缆技术的研究与应用

热门文章

  1. LeetCode算法题-Jewels and Stones(Java实现)
  2. 淘宝top平台调用接口响应时间优化
  3. H面试程序(29):求最大递增数
  4. python进阶10 MySQL补充 编码、别名、视图、数据库修改
  5. 如何解决机器学习中的数据不平衡问题?
  6. 修改Advance Template Jsp模板的编码格式
  7. c++虚函数的前奏--函数指针与回调
  8. Product文本格式说明
  9. 【图像处理】——Python OpenCV实现形态学膨胀、腐蚀开闭操作(可以用于图像滤波、图像分割等)
  10. C++ 多线程使用future传递异常