摘抄自[url]http://zhmocean.iteye.com/blog/759809[/url]
1、使用实例锁而非类锁。比如:
此时加的是类锁,我们只要改成:
就可以把时间损耗降低 25% 。
2、使用细粒度锁。即,对共享资源加锁而非方法(实质是对象锁)比如:
实质是加了类锁,导致线程等待时间产生无谓的浪费,那么我们可以改成:
经过这样优化,时间消耗降低了 67%
3、锁定元素而非集合。比如:
可以改为:
时间降低 66% 的损耗
4、使用原子 Atomic 系列类型进行无锁编程。
具体可见 AtomicLongArray 的用法(此用法在 JDK1.5+ 里可用)
问题的关键点就在共享资源的调度和使用,其中一个原则就是,共享资源越少越好,线程间交互越少,效能越高。
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+ 里可用)
问题的关键点就在共享资源的调度和使用,其中一个原则就是,共享资源越少越好,线程间交互越少,效能越高。