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

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

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

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

分享:

  过多串行化

  用多线程实际上就是想并行地做事情,但这些事情由于某些依赖性必须串行工作,导致很多环节得串行化,这实际上很局限系统的可扩展性,就算加CPU加线程,但性能却没有线性增长。有个Amdahl定理可以说明这个问题:

  其中,F是串行化比例,N是处理器数量,由上可知,只有尽可能减少串行化,才能最大化地提高可扩展能力。降低串行化的关键就是降低锁竞争,当很多并行任务挂在锁的获取上,就是串行化的表现

  过多锁竞争

  过多锁竞争的危害是不言而喻的,那么看看有哪些办法来降低锁竞争

  1)缩小锁的范围

  前面也谈到这一点,尽量缩小锁保护的范围,快进快出,因此尽量不要直接在方法上使用synchronized关键字,而只是在真正需要线程安全保护的地方使用

  2)减小锁的粒度

  Java 5提供了显式锁后,可以更为灵活的来保护共享变量。synchronized关键字(用在方法上)是默认把整个对象作为锁,实际上很多时候没有必要用这么大一个锁,这会导致这个类所有synchronized都得串行执行。可以根据真正需要保护的共享变量作为锁,也可以使用更为精细的策略,目的就是要在真正需要串行的时候串行,举一个例子:

  • public class StripedMap {  
  •     // Synchronization policy: buckets[n] guarded by locks[n%N_LOCKS]   
  •     private static final int N_LOCKS = 16;  
  •     private final Node[] buckets;  
  •     private final Object[] locks;  
  •     private static class Node { ... }  
  •     public StripedMap(int numBuckets) {  
  •         buckets = new Node[numBuckets];  
  •         locks = new Object[N_LOCKS];  
  •         for (int i = 0; i < N_LOCKS; i++)  
  •             locks[i] = new Object();  
  •     }  
  •     private final int hash(Object key) {  
  •         return Math.abs(key.hashCode() % buckets.length);  
  •     }  
  •     public Object get(Object key) {  
  •         int hash = hash(key);  
  •         synchronized (locks[hash % N_LOCKS]) {  
  •             for (Node m = buckets[hash]; m != null; m = m.next)  
  •                 if (m.key.equals(key))  
  •                     return m.value;  
  •         }  
  •         return null;  
  •     }  
  •     public void clear() {  
  •         for (int i = 0; i < buckets.length; i++) {  
  •             synchronized (locks[i % N_LOCKS]) {  
  •                 buckets[i] = null;  
  •             }  
  •         }  
  •     }  
  •     ...  
  • }
  •   上面这个例子是通过hash算法来把存取的值所对应的hash值来作为锁,这样就只需要对hash值相同的对象存取串行化,而不是像HashTable那样对任何对象任何操作都串行化。

    32/3<123>
    重磅发布,2022软件测试行业现状调查报告~

    关注51Testing

    联系我们

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

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

    沪ICP备05003035号

    沪公网安备 31010102002173号