摘自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+ 里可用)
问题的关键点就在共享资源的调度和使用,其中一个原则就是,共享资源越少越好,线程间交互越少,效能越高。