关于降低锁的竞争程度------从奶爸的角度思考
关于降低锁的竞争程度------从奶爸的角度思考
题外话:这篇文章的灵感来源于近日带娃耍。
锁竞争带来的问题
- 在锁上发生竞争,导致串行操作花费的时间比例增加,进而降低程序的可伸缩性。具体可参考Amdahl定律,大致可理解为处理器的利用率p与处理器数量n和串行比例f成反比,p = 1/nf.
- 此外,在锁上发生竞争,导致上下文切换的开销增加,进而降低程序的性能。基本上每一次上下文切换都涉及到操作系统,JVM,缓存的个方面的开销。
降低锁的竞争程度的好处
基于上面所述,降低锁的竞争程度,是有利于程序的可伸缩性和性能的。
降低锁的竞争程度的方式
一般以下三种方式:
- 减少锁的持有时间。
- 降低锁的请求频率。
- 使用一些协调机制。
这三种方式应该是很容易理解的。
从奶爸的角度思考以下场景
假设以下场景:几个小孩,一个奶爸,一堆玩具,小孩必须通过奶爸才能拿到玩具,而奶爸一次只能被满足一个小孩的要求,并且小孩在玩耍后必须对玩具进行清洁放回原位。
- 如果每个小孩在拿到玩具后只是玩耍,不需要花时间来给玩具做清洁并放回原位,那么势必增加其他小孩玩耍玩具的机会。此处相当于缩小锁的范围,将一些和锁无关的,长时间的操作移除,把锁用在真正需要的地方。
- 如果每个小孩不需要通过奶爸才能拿到玩具,而是只要玩具没有其他小孩玩耍,就可以拿来玩。那么势必大大增加了每个小孩玩耍玩具的机会。此处相当于减小锁的粒度,通过锁分解和锁分段,多个相互独立的锁来保护独立的变量,这样就降低了每个锁被请求的频率。
如果奶爸来协调安排各个小孩玩耍玩具,而不是每一次只能满足一个小孩的要求,那么势必玩具的使用度和小孩的体验度也会很好。此处相当于使用一些协调机制来管理共享状态。
备注:小孩相当于线程,玩具相当于资源,奶爸相当于独占锁(1,2)或者某种协调机制(3)。
生活中的事想想也是挺有趣的吧。 :)
关于降低锁的竞争程度------从奶爸的角度思考相关推荐
- 探索JAVA并发 - 如何减少锁的竞争
锁的竞争会限制代码的可伸缩性,在并发编程时通过一些手段有意地减少锁竞争,可以让程序有更好的表现. 作者:acupt,专注Java,架构师社区合伙人! 所谓可伸缩性,即当增加计算资源(如CPU.内存.带 ...
- mysql减少锁等待_降低锁竞争 减少MySQL用户等待时间
[IT168 技术]通过锁机制,可以实现多线程同时对某个表进行操作.如下图所示,在某个时刻,用户甲.用户乙.用户丙可能会同时或者先后(前面一个作业还没有完成)对数据表A进行查询或者更新的操作.当某个线 ...
- 初探SEO关键词竞争程度的智能算法思路
腾讯DeepOcean原创文章:http://dopro.io/seo-intelligent-algorithm.html 在seo优化过程中,关键词尤其重要.一个恰当的关键词往往可以给网站导入非常 ...
- 最大程度地降低乘员地伤害程度
对于一款7座大型MPV来讲,车内才是真正的重点,假如我是用户,我会对舒适程度.配置.空间等方面有着很高的要求.新GL8的内饰设计一改老款车型浓重的美式风格,比如不再使用怀挡,换掉了尺寸硕大的方向盘,重 ...
- 本田crv混动操作手册_【广汽本田】不只是奶爸车 新出行试驾本田奥德赛锐混动...
现在在市场上其实我们不难发现旅行车/MPV 的身影是越来越多了,似乎各大厂家都在不约而同的瞄准 MPV 市场投放车型.从十几万到破百万的价格区间我们都可以找到合适自己使用的不同种类 MPV 车型,当然 ...
- 上海交大25岁博士奶爸!6块腹肌,Science一作,人民日报都点赞了
上海交通大学 在读博士生王言博火了! 热搜上是他的名字 "人民日报"微信也为他点赞了 王言博是谁?为什么会火? ▽ 他是上海交通大学年度人物 Science一作.校园歌赛冠军 他还 ...
- 恶魔的奶爸英语 初级教程
源地址:http://site.douban.com/195274/widget/notes/11672161/note/323335577/ 作者:恶魔的奶爸 1,级别和动机自测: 首先,你得明白你 ...
- 上海交大25岁博士奶爸火了!6块腹肌,Science一作,人民日报都点赞了
本文综合自:中国青年报.上海交通大学官微."益友sjtu".新浪微博等 相关作者:孟昊宇 林鸿展 石京成 王铭 微信编辑:皮小姐 上海交通大学 在读博士生王言博火了! 热搜上是他的 ...
- 30+下岗程序员专职奶爸如何生存?
风险提示:我是小菜鸡,这里提到的内容只是我的个人观点,只记录自己,不做任何推荐. [30+下岗程序员专职奶爸如何生存??? 我会分享:投资实盘.带娃.编程技术运用生活等-- 不断搞钱,持续成长,终生学 ...
最新文章
- 公用表达式 CTE with as 用法总结
- wordcount代码_Scala小案例之wordcount
- 删除数据库日志sql语句
- 一键清除bios密码_电脑忘记开机密码?怎么才能开机使用
- ML之DT:基于简单回归问题训练决策树(DIY数据集+七种{1~7}深度的决策树{依次进行10交叉验证})
- 鹤峰:美丽的茶乡—— 山水篇
- 什么是协议转换器?协议转换器的定义
- jeecg集成实现websocket
- [POI2014]Solar Panels
- Cache-Control的一些认识
- python全栈开发-Day11 迭代器、生成器、面向过程编程
- 在Windows Server 2008 R2上安装Ftp服务
- python numpy 里面的[:, None]是个什么鬼?[..., None]呢?
- 文本的平均列数python-CDA数据分析师
- 2.1 图像验证码(英文验证码、超级鹰)
- 微信小程序应用百度地图API
- tomcat8的apr模式配置SLL证书
- 使用Python生成ico文件
- 【Oracle】并行等待之PX Deq: Join ACK
- Nacos 修改密码
热门文章
- php中怎么函数加字符串,如何使用PHP中的字符串函数
- java xml 解析 列表_用Java解析高级XML
- ansys本地的help文件_PostgreSQL本地/远程登陆配置
- linux函数 取值溢出,Linux eCryptfs工具parse_tag_3_packet()函数堆溢出漏洞
- idea yml变成文件了_初识SpringBoot之配置文件(二)——配置文件值注入
- Vue3+Cli4 中使用 Echarts 5
- zimbra mysql管理_zimbra 命令行管理
- 我的世界服务器不显示浮空字,我的世界服务器浮空字怎么做 | 手游网游页游攻略大全...
- 在nodejs项目装一个库的多个版本
- c2665 “initgraph”: 2 个重载中没有一个可以转换所有参数类型_一个使用延迟候选项生成的用于自动化程序修复方法的工具...