有助于提高"锁"性能的几点建议

1.减少锁持有时间

    public synchronized void syncMethod() {
othercode1();
mutextMethod();
othercode2();
}

syncMethod()方法中,假设只有mutextMethod()方法是有同步需要的,如果othercode1()和othercode2()分别是重量级的方法,则会花费较长的CPU时间.

一个较为优化的解决方案是,只在必要时进行同步,这样就能明显减少线程持有锁的时间,提高系统的吞吐量;

    public void syncMethod() {
othercode1();
synchronized (this) {
mutextMethod();
}
othercode2();
}

2.减小锁粒度

这种技术典型的使用场景就是ConcurrentHashMap.

对于HashMap来说,最重要的两个方法就是get() 和put(),一种最自然的想法就是对整个HashMap加锁,必然可以得到一个线程安全的对象.但是这样做,我们就认为加锁粒度太大.对于ConcurrentHashMap,它内部进一步细分了若干个小的hashMap,称之为段(SEGMENT).默认的情况下,一个ConcurrentHashMap被进一步细分为16个段

如果需要在ConcurrentHashMap中增加一个新的表项,并不是整个HashMap加锁,而是首先根据hashcode得到该表项应该被存放到哪个段中,然后对该段加锁,并完成put()操作.在多线程环境中,如果多个线程同时进行put()操作,只要被加入的表项不存放在同一个段中,则线程间便可以做到真正的并行

3.读写分离锁来替换独占锁

在读多写少的场合,使用读写锁可以有效提升系统的并发能力

4.锁分离

如果将读写锁的思想进一步的延伸,就是锁分离.读写锁根据读写锁操作功能上的不同,进行了有效的锁分离.使用类似的思想,也可以对独占锁进行分离.

5.锁粗化

凡事都有一个度,如果对同一个锁不停地进行请求,同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化

为此,虚拟机在遇到一连串连续地对同一锁不断进行请求和释放的操作时,便会把所有的锁操作整合成对锁的一次请求,从而减少对锁的请求同步次数,这个操作叫做锁的粗化.

	public void demoMethod() {
synchronized (lock) {
//do sth
} //做其他不需要的同步的工作,但能很快执行完毕
synchronized (lock) {
//do sth.
}
}

上述代码会被整合成

	public void demoMethod() {
synchronized (lock) {
//do sth
//做其他不需要的同步的工作,但能很快执行完毕
}
}

在开发过程中,大家也应该有意识地在合理地场合进行锁的粗化,尤其当在循环内请求锁时.

for (int i = 0; i < CIRCLE; i++) {
synchronized (lock){ }
}

一种更加合理地做法应该是:

synchronized (lock){
for (int i = 0; i < CIRCLE; i++) { }
}

最新文章

  1. OSI7层模型详解
  2. 让动态的 iframe 内容高度自适应
  3. ASP.NET MVC 微信公众号支付,微信公众平台配置
  4. jQuery.queue源码分析
  5. T-SQL---多值模糊查询的处理
  6. MySQL字符编码
  7. Oracle监听器—动态注册
  8. Java数据结构漫谈-LinkedList
  9. Error:Execution failed for task &#39;:app:mergeDebugResources&#39;. &gt; Some file crunching failed, see logs for details
  10. 在CentOS下源码安装 Xen并搭建Windows虚拟机
  11. java学习笔记2015-6-6
  12. Mac下面解决PYTHONPATH配置的方法
  13. Ubuntu18.04美化主题(mac主题)
  14. 利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库)
  15. mysql 查询 int类型日期转换成datetime类型
  16. @EnableHystrix
  17. npm 遇到的坑
  18. 纪念使用FTPClient工具所遇到的
  19. jmeter学习笔记--线程组
  20. Redis详细讲解(Redis原理,Redis安装,Redis配置,Redis使用,Redis命令)

热门文章

  1. Ruby中的数值
  2. PHP弱类型总结
  3. 【HDU - 3085】Nightmare Ⅱ(bfs)
  4. HDU 6207:Apple(Java高精度)
  5. Codeforces Gym101097I:Sticks (思维)
  6. 对于Spring中AOP,DI,IoC概念的理解
  7. 嵊州D2T3 玛利亚∙多斯普拉泽雷斯 完美配对
  8. C语言学习书籍推荐《C程序设计语言(第2版•新版)》下载
  9. 从后端到前端之Vue(一)写个表格试试水
  10. 微信小程序开发--组件(5)