并发之锁的优化

锁优化

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是效率较低的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值