- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如何提高Java中锁的性能.
如何提高 Java 中锁的性能
我们努力为自己的产品所遇到的问题思考解决办法,但在这篇文章中我将给大家分享几种常用的技术,包括分离锁、并行数据结构、保护数据而非代码、缩小锁的作用范围,这几种技术可以使我们不使用任何工具来检测死锁。
两个月前向Plumbr公司引进线程死锁的检测之后,我们开始收到一些类似于这样的询问:“棒极了!现在我知道造成程序出现性能问题的原因了,但是接下来该怎么做呢?”
我们努力为自己的产品所遇到的问题思考解决办法,但在这篇文章中我将给大家分享几种常用的技术,包括分离锁、并行数据结构、保护数据而非代码、缩小锁的作用范围,这几种技术可以使我们不使用任何工具来检测死锁。
锁不是问题的根源,锁之间的竞争才是
通常在多线程的代码中遇到性能方面的问题时,一般都会抱怨是锁的问题。毕竟锁会降低程序的运行速度和其较低的扩展性是众所周知的。因此,如果带着这种“常识”开始优化代码,其结果很有可能是在之后会出现讨人厌的并发问题。
因此,明白竞争锁和非竞争锁的不同是非常重要的。当一个线程试图进入 另一个线程正在执行的同步块或方法时会触发锁竞争。该线程会被强制进入等待状态,直到第一个线程执行完同步块并且已经释放了监视器。当同一时间只有一个线 程尝试执行同步的代码区域时,锁会保持非竞争的状态。
事实上,在非竞争的情况下和大多数的应用中,JVM已经对同步进行了优化。非竞争锁在执行过程中不会带来任何额外的开销。因此,你不应该因为性能问题抱怨锁,应该抱怨的是锁的竞争。当有了这个认识之后,让我们来看下能做些什么,以降低竞争的可能性或减少竞争的持续时间。
保护数据而非代码
解决线程安全问题的一个快速的方法就是对整个方法的可访问性加锁。例如下面这个例子,试图通过这种方法来建立一个在线扑克游戏服务器:
class?GameServer?{?
??public?MapString,?ListPlayer?tables?=?new?HashMapString,?ListPlayer();?
?
??public?synchronized?void?join(Player?player,?Table?table)?{?
????if?(player.getAccountBalance()??table.getLimit())?{?
??????ListPlayer?tablePlayers?=?tables.get(table.getId());?
??????if?(tablePlayers.size()??9)?{?
????????tablePlayers.add(player);?
??????}?
????}?
??}?
??public?synchronized?void?leave(Player?player,?Table?table)?{/*body?skipped?for?brevity*/}?
??public?synchronized?void?createTable()?{/*body?skipped?for?brevity*/}?
??public?synchronized?void?destroyTable(Table?table)?{/*body?skipped?for?brevity*/}?
}?
作者的意图是好的——当一个新的玩家加入牌桌 时,必须确保牌桌上的玩家个数不会超过牌桌可以容纳的玩家总个数9。
但是这种解决办法事实上无论何时都要对玩家进入牌桌进行控制——即使是在服务器的访问量较小的时候也是这样,那些等 待锁释放的线程注定会频繁的触发系统的竞争事件。包含对账户余额和牌桌限制检查的锁定块很可能大幅提高调用操作的开销,而这无疑会增加竞争的可能性和持续 时间。
解决的第一步就是确保我们保护的是数据,而不是从方法声明移到方法体中的那段同步声明。对于上面那个简单的例子来说,可能改变不大。但是我们要站在整个游戏服务的接口之上来考虑,而不是单单的一个join()方法。
class?GameServer?{?
??public?MapString,?ListPlayer?tables?=?new?HashMapString,?ListPlayer();?
?
??public?void?join(Player?player,?Table?table)?{?
????synchronized?(tables)?{?
??????if?(player.getAccountBalance()??table.getLimit())?{?
????????ListPlayer?tablePlayers?=?tables.get(table.getId());?
????????if?(tablePlayers.size()??9)?{?
您可能关注的文档
- 如何找回因停电等原因没有保存的excelWord表格(03版本)..doc
- 如何把“数据”转化成可以行动的“信息”..doc
- 如何把图片上的文字弄到文字处理软件进行编辑..doc
- 如何把握和计算肉种鸡的料量..doc
- 如何把握离职率的正确含义以及其参考价值..doc
- 如何把自己培养成为有独立思考能力的人..doc
- 如何把握教材..doc
- 如何把自己的照片处理成手绘效果..doc
- 如何把自已的电脑设成可以远程控制的电脑..doc
- 如何把音乐转成伴奏..docx
- 技术合同认定登记模板(3篇).docx
- 培训合作的协议书范本.docx
- 技术合同认定协议模板(3篇).docx
- 2025年综合类-船员基本安全培训考试-船上安全作业历年真题摘选带答案(5卷单选一百题).docx
- 培训合同协议书范本模板.docx
- 2025年哈尔滨城市职业学院单招笔试英语试题库含答案解析(5套100道合辑-单选题).docx
- 第六章其他物理污染与防护.ppt
- 2025年住院医师规范培训(各省)-福建住院医师病理科历年参考题库含答案解析(5卷单项选择题100题.docx
- 2025年黑龙江建筑职业技术学院单招笔试英语试题库含答案解析(5套100道合辑-单选题).docx
- 电工实验课件.ppt
文档评论(0)