golang之包和锁的机制
互斥锁
同一时刻只有一个携程在操作
package mainimport ("fmt""math/rand""sync""time" ) //互斥锁 var lock sync.Mutexfunc testMap() {var a map[int]inta = make(map[int]int, 5)a[8] = 10a[3] = 10a[2] = 10a[1] = 10for i := 0; i < 2; i++ {func(b map[int]int) {lock.Lock()b[8] = rand.Intn(100)lock.Unlock()}(a)}lock.Lock()fmt.Println(a)lock.Unlock()time.Sleep(time.Second) } func main() {//互斥锁 testMap() }
读写锁
读多写少的情况,用读写锁, 携程同时在操作读。
package mainimport ("fmt""math/rand""sync""time" )//读写锁 var rwLock sync.RWMutexfunc testRWLock() {var a map[int]inta = make(map[int]int, 5)a[8] = 10a[3] = 10a[2] = 10a[1] = 10a[18] = 10for i := 0; i < 2; i++ {go func(b map[int]int) {rwLock.Lock()b[8] = rand.Intn(100)rwLock.Unlock()}(a)}for i := 0; i < 100; i++ {go func(b map[int]int) {rwLock.RLock() //读锁 fmt.Println(a)rwLock.RUnlock()}(a)}time.Sleep(time.Second * 20)} func main() { testRWLock()//读多写少的时候,用读写锁 }
读写锁,互斥锁,性能比较
package mainimport ("fmt""math/rand""sync""sync/atomic""time" )//读写锁 var rwLock sync.RWMutex var lock sync.Mutexfunc testRWLock() {var a map[int]inta = make(map[int]int, 5)var count int32a[8] = 10a[3] = 10a[2] = 10a[1] = 10a[18] = 10for i := 0; i < 2; i++ {go func(b map[int]int) {//rwLock.Lock() //读写锁的代码lock.Lock() //互斥锁的代码b[8] = rand.Intn(100)time.Sleep(10 * time.Microsecond) //微妙//rwLock.Unlock()lock.Unlock()}(a)}for i := 0; i < 100; i++ {go func(b map[int]int) {for {//rwLock.RLock() //读写锁的代码lock.Lock()time.Sleep(time.Millisecond)//rwLock.RUnlock()lock.Unlock()atomic.AddInt32(&count, 1)}}(a)}time.Sleep(time.Second * 20)fmt.Println(atomic.LoadInt32(&count)) } func main() {//互斥锁 testRWLock()//读多写少的时候,用读写锁 }
转载于:https://www.cnblogs.com/pyyu/p/8186313.html
golang之包和锁的机制相关推荐
- 常见的锁策略、synchronized中的锁优化机制
一.常见的锁策略 锁策略,和普通程序猿基本没啥关系,和 "实现锁" 的人才有关系的 这里所提到的锁策略,和 Java 本身没关系,适用于所有和 "锁" 相关的情 ...
- 深入理解JAVA锁的机制
2019独角兽企业重金招聘Python工程师标准>>> 1. synchronized实现原理 在java代码中使用synchronized可是使用在代码块和方法中,根据Synchr ...
- oracle 包 被锁,Oracle包被锁定的原因分析及解决方案
Oracle包被锁定的原因分析及解决方案 在数据库的开发过程中,经常碰到包.存储过程.函数无法编译或编译时会导致PL/SQL 无法响应的问题.碰到这种问题,基本上都要重启数据库解决,严重浪费开发时间. ...
- 【golang程序包推荐分享】go-ini、viper、godoc
[golang程序包推荐&分享]go-ini.viper.godoc 一.go-ini 1.程序包简介 2.下载安装 3.简单使用[截取自官网] 二.viper 1.程序包简介 2.下载安装 ...
- fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Fiddler的HTTPS抓包功能." 这里首先回答下标题中的疑问,fiddler抓包带锁的原因是HTTPS流量抓包功能开启, ...
- golang 理解包导入
Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显 ...
- golang 第三方包的使用总结
golang 第三方包的安装的方法 1. go get 安装 # 比如要安装 "github.com/gin-gonic/gin" $ go get github.com/gin- ...
- mysql更新锁机制_mysql查询更新时的锁表机制分析
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁 ...
- glide 下载golang.org包问题
2019独角兽企业重金招聘Python工程师标准>>> 今天编译Uber的Aresgo.依赖管理用 glide,下载golang.org 包的时候遇到问题. 方法一: 设置 glid ...
最新文章
- 数据分析工具Pandas(3):Pandas的对齐运算
- 设计模式-UML图简单介绍
- vs2017运行显示系统找不到指定的文件_windows 平台使用 VS2017 编译 libevent 源码
- LA3971 组装电脑
- 【追一科技校招】AI浪潮已来,你不可错过的澎湃风口!
- 电源开关上的 | 和 O 究竟代表了什么?
- memmove()/mmecpy()
- 专业文化计算机艺考生,专业课和文化课都优秀?那艺考生的你不知道这个就损失大了...
- cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别
- 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinjazz/archive/2009/04/29/4138000.aspx...
- VGG16 、VGG19 、ResNet50 、Inception V3 、Xception介绍
- python音乐下载器
- Ultra Fast Deep Lane Detection with Hybrid Anchor Driven Ordinal Classification论文解读
- 成功解决pyinstaller打包时报错:lib not found的问题
- 关于去除“请选择”问题
- Affinity propagation 近邻传播算法
- L3 Sequence
- 【NLP】语法、文法、句法、词法概念的区别
- 时光飞逝,思考,实践,伴我一生的经验
- 可变悬挂调节软硬_可变悬架软硬怎么调节高度
热门文章
- mysql报错注入_关于Mysql注入过程中的三种报错方式
- mysql backdoor_Mysql UDF BackDoor
- linux下vim编辑器的基本使用
- 【Deep Learning笔记】前馈神经网络和BP算法
- 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY9-聚类
- python多进程优化_『Python』多进程处理
- srm linux字符界面,如何使用srm安全的删除Linux中的文件
- 为啥led灯用一年后暗了很多_嫌原车的卤素“蜡烛灯”太暗,想换掉,该选氙气灯还是LED灯?...
- 网站的次导航是什么?对网站优化有什么好处?
- linux 某个文件打不开了,linux操作系统下,exe文件为什么打不开?