优化多线程执行效率

摘抄自[url]http://zhmocean.iteye.com/blog/759809[/url]
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+ 里可用)

问题的关键点就在共享资源的调度和使用,其中一个原则就是,共享资源越少越好,线程间交互越少,效能越高。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值