锁在应用层的优化思路
2015-10-12 15:38
477 查看
减少锁的持有时间
减小锁粒度
比如:ConcurrentHashMap中增加一个表项,并不是将整个HashMap加锁,而是首先根据hashcode得到该表项应该被存放到哪个段中,然后对该段加锁,并完成put()操作。在多线程环境中,如果多个线程同时进行put()操作,只要被加入的表项不存放在同一个段中,则线程间便可以做到真正的并发。
锁分离
依据应用程序的功能特点,将一个独占锁分成多个锁。如:LinkedBlockingQueue中使用ReentrantLock定义两个锁,takeLock和putLock,实现了取数据和写数据的分离。
锁粗化
如果对同一个锁不停地进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化。
减小锁粒度
比如:ConcurrentHashMap中增加一个表项,并不是将整个HashMap加锁,而是首先根据hashcode得到该表项应该被存放到哪个段中,然后对该段加锁,并完成put()操作。在多线程环境中,如果多个线程同时进行put()操作,只要被加入的表项不存放在同一个段中,则线程间便可以做到真正的并发。
锁分离
依据应用程序的功能特点,将一个独占锁分成多个锁。如:LinkedBlockingQueue中使用ReentrantLock定义两个锁,takeLock和putLock,实现了取数据和写数据的分离。
锁粗化
如果对同一个锁不停地进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化。
相关文章推荐
- Android 项目(详解二)—— 网络连接(2)
- 黑马程序员——Java基础--------Map集合
- C语言中的字符数组与字符串
- jQuery(一)sibling方法
- 人是怎么了
- redmine使用汇总redmine软件工程过程
- js下firstElementChild firstChild 以及childNodes和children方法
- Nodejs入门学习——fs.renameSync出错
- python logging 模板
- Java 代码块
- 数据结构和算法学习(8)-二叉树
- vim 删除与复制
- 去掉inline-block元素间隙的几种方法
- C#发送邮件及附件
- 网上下载的tomcat源码导入eclipse启动出现问题
- #你不知道的APICloud# 五步搞定iOS 断点调试
- Geek生活--netHack
- 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(10月8日~10月11日)
- Android新浪微博client(七)——ListView图片异步加载、高速缓存
- cookie 和session 的区别详解