优化线程执行效率

摘自http://zhmocean.iteye.com/blog/759809

1、 使用实例锁而非类锁。 

比如:

       public synchronized void foo1(int k){

              String key = Integer.toString(k);

              String value = key+”value”;

              if(null == key){

                     return;

              }else{

                     maph.put(key, value);

              {

}

       此时加的是类锁,我们只要改成

       public void foo1(int k){

              String key = Integer.toString(k);

              String value = key+”value”;

              if(null == key){

                     return;

              }else{

                     synchronized(this){

                            maph.put(key,value);

}

              }

}

       就可以把时间损耗降低25%。

2、 使用细粒度锁。即,对共享资源加锁而非方法(实质是对象锁) 

比如:

       public synchronized void addUser1(String u){

              users.add(u);

}

 

       public synchronized void addQuery1(String q){

              queries.add(q);

}

       实质是加了类锁,导致线程等待时间产生无谓的浪费,那么我们可以改成

       public void addUser2(String u){

synchronized(users){

                     users.add(u);

}

 

       public void addQuery2(String q){

              synchronized(queries){

queries.add(q);

                     }

}

       经过这样优化,时间消耗降低了67%

3、 锁定元素而非集合。 

比如:

       public synchronized void put1(int index,String k){

              share[index] = k;

}

       可以改为

       public void put1(int index, String k){

synchronized(locks[index%N_LOCKS]){

                     share[index] = k;

}

}

       时间降低66%的损耗


4、使用原子 Atomic 系列类型进行无锁编程。
        具体可见 AtomicLongArray 的用法(此用法在 JDK1.5+ 里可用)

        问题的关键点就在共享资源的调度和使用,其中一个原则就是,共享资源越少越好,线程间交互越少,效能越高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值