探索并发编程(六)------Java多线程性能优化

发表于:2011-9-29 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:cutesource    来源:51Testing软件测试网采编

  大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大。下面列举一下可能会造成多线程性能问题的点:

  ● 死锁
  ● 过多串行化
  ● 过多锁竞争
  ● 切换上下文
  ● 内存同步

  下面分别解析以上性能隐患

  死锁

  关于死锁,我们在学习操作系统的时候就知道它产生的原因和危害,这里就不从原理上去累述了,可以从下面的代码和图示重温一下死锁产生的原因:

  • public class LeftRightDeadlock {  
  •     private final Object left = new Object();  
  •     private final Object right = new Object();  
  •     public void leftRight() {  
  •         synchronized (left) {  
  •             synchronized (right) {  
  •                 doSomething();  
  •             }  
  •         }  
  •     }  
  •     public void rightLeft() {  
  •         synchronized (right) {  
  •             synchronized (left) {  
  •                 doSomethingElse();  
  •             }  
  •         }  
  •     }  
  • }
  •   预防和处理死锁的方法:

      1)尽量不要在释放锁之前竞争其他

      一般可以通过细化同步方法来实现,只在真正需要保护共享资源的地方去拿锁,并尽快释放锁,这样可以有效降低在同步方法里调用其他同步方法的情况

      2)顺序索取锁资源

      如果实在无法避免嵌套索取锁资源,则需要制定一个索取锁资源的策略,先规划好有哪些锁,然后各个线程按照一个顺序去索取,不要出现上面那个例子中不同顺序,这样就会有潜在的死锁问题

      3)尝试定时锁

      Java 5提供了更灵活的锁工具,可以显式地索取和释放锁。那么在索取锁的时候可以设定一个超时时间,如果超过这个时间还没索取到锁,则不会继续堵塞而是放弃此次任务,示例代码如下:

  • public boolean trySendOnSharedLine(String message,  
  •                                    long timeout, TimeUnit unit)  
  •                                    throws InterruptedException {  
  •     long nanosToLock = unit.toNanos(timeout)  
  •                      - estimatedNanosToSend(message);  
  •     if (!lock.tryLock(nanosToLock, NANOSECONDS))  
  •         return false;  
  •     try {  
  •         return sendOnSharedLine(message);  
  •     } finally {  
  •         lock.unlock();  
  •     }  
  • }
  •   这样可以有效打破死锁条件。

      4)检查死锁

      JVM采用thread dump的方式来识别死锁的方式,可以通过操作系统的命令来向JVM发送thread dump的信号,这样可以查询哪些线程死锁。

    31/3123>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号