锁优化
1、减少锁的持有时间
public synchronized void test(){
needLock();
dontNeedLock();
}
改成
public void test(){
synchronized needLock();
dnotNeedLock();
}
2、降低锁的粒度
将大对象拆分成小对象,对小对象进行加锁,降低锁的粒度,使得偏向锁和轻量级锁使用率提高。比如对于hashmap的锁,使用concurrenthashmap的锁的粒度就比Collections.synchronizedMap的锁的粒度要小,效率要高。concurrenthashmap支持多个并发修改,读写分离。
3、使用读写锁替换独占锁,锁分离
阻塞队列中的LinkedBlockingQueue使用的是两个独立的锁,它对于队首和队尾采用两个锁来分别控制数据的存入和取出,效率很高。
4、锁粗化
如果一个线程对锁的持有时间很长,显然在高并发情况下也是效率很低的。为了保证线程持有锁的时间比较合理,我们可以对锁适当的进行粗化。
for(int i=0;i<1000;i++){
sychronized(lock){}
}
改成
synchronized(lock){
for(int i=0;i<1000;i++){}
}
5、可以使用CAS实现线程的自旋等待,当然这个自旋的过程应该比较短。还可以使用atomic包下的类来进行操作,比如i++操作。就可以使用AtomicInteger来代替。
6、使用线程安全的集合
ConcurrentHashMap、CopyOnWriteArrayList是效率较高的;
hashtable、properties、Vector、Collections.synchronizedXXX是效率较低的。