互斥锁

同一时刻只有一个携程在操作

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之包和锁的机制相关推荐

  1. 常见的锁策略、synchronized中的锁优化机制

    一.常见的锁策略 锁策略,和普通程序猿基本没啥关系,和 "实现锁" 的人才有关系的 这里所提到的锁策略,和 Java 本身没关系,适用于所有和 "锁" 相关的情 ...

  2. 深入理解JAVA锁的机制

    2019独角兽企业重金招聘Python工程师标准>>> 1. synchronized实现原理 在java代码中使用synchronized可是使用在代码块和方法中,根据Synchr ...

  3. oracle 包 被锁,Oracle包被锁定的原因分析及解决方案

    Oracle包被锁定的原因分析及解决方案 在数据库的开发过程中,经常碰到包.存储过程.函数无法编译或编译时会导致PL/SQL 无法响应的问题.碰到这种问题,基本上都要重启数据库解决,严重浪费开发时间. ...

  4. 【golang程序包推荐分享】go-ini、viper、godoc

    [golang程序包推荐&分享]go-ini.viper.godoc 一.go-ini 1.程序包简介 2.下载安装 3.简单使用[截取自官网] 二.viper 1.程序包简介 2.下载安装 ...

  5. fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Fiddler的HTTPS抓包功能." 这里首先回答下标题中的疑问,fiddler抓包带锁的原因是HTTPS流量抓包功能开启, ...

  6. golang 理解包导入

    Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显 ...

  7. golang 第三方包的使用总结

    golang 第三方包的安装的方法 1. go get 安装 # 比如要安装 "github.com/gin-gonic/gin" $ go get github.com/gin- ...

  8. mysql更新锁机制_mysql查询更新时的锁表机制分析

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁 ...

  9. glide 下载golang.org包问题

    2019独角兽企业重金招聘Python工程师标准>>> 今天编译Uber的Aresgo.依赖管理用 glide,下载golang.org 包的时候遇到问题. 方法一: 设置 glid ...

最新文章

  1. 数据分析工具Pandas(3):Pandas的对齐运算
  2. 设计模式-UML图简单介绍
  3. vs2017运行显示系统找不到指定的文件_windows 平台使用 VS2017 编译 libevent 源码
  4. LA3971 组装电脑
  5. 【追一科技校招】AI浪潮已来,你不可错过的澎湃风口!
  6. 电源开关上的 | 和 O 究竟代表了什么?
  7. memmove()/mmecpy()
  8. 专业文化计算机艺考生,专业课和文化课都优秀?那艺考生的你不知道这个就损失大了...
  9. cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别
  10. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinjazz/archive/2009/04/29/4138000.aspx...
  11. VGG16 、VGG19 、ResNet50 、Inception V3 、Xception介绍
  12. python音乐下载器
  13. Ultra Fast Deep Lane Detection with Hybrid Anchor Driven Ordinal Classification论文解读
  14. 成功解决pyinstaller打包时报错:lib not found的问题
  15. 关于去除“请选择”问题
  16. Affinity propagation 近邻传播算法
  17. L3 Sequence
  18. 【NLP】语法、文法、句法、词法概念的区别
  19. 时光飞逝,思考,实践,伴我一生的经验
  20. 可变悬挂调节软硬_可变悬架软硬怎么调节高度

热门文章

  1. mysql报错注入_关于Mysql注入过程中的三种报错方式
  2. mysql backdoor_Mysql UDF BackDoor
  3. linux下vim编辑器的基本使用
  4. 【Deep Learning笔记】前馈神经网络和BP算法
  5. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY9-聚类
  6. python多进程优化_『Python』多进程处理
  7. srm linux字符界面,如何使用srm安全的删除Linux中的文件
  8. 为啥led灯用一年后暗了很多_嫌原车的卤素“蜡烛灯”太暗,想换掉,该选氙气灯还是LED灯?...
  9. 网站的次导航是什么?对网站优化有什么好处?
  10. linux 某个文件打不开了,linux操作系统下,exe文件为什么打不开?