Java并发之锁的优化

在高并发的环境下,激烈的锁竞争会导致程序性能下降。

1、减小锁持有的时间

在锁的竞争过程中,如果某个线程获得了锁,那其他线程就只有等了,如果该线程持有的时间长,那就会影响系统性能。

public void synchronized function(){
    otherCode1();
    mutexCode(); //需要同步的代码
    otherCode2();
}
//改为
public void function(){
    otherCode1();
    synchronized {
        mutexCode();
    }
    otherCode2();
}

2、锁粗化

在程序中,应该避免对同一个锁不停地请求,同步和释放。这本身也会消耗系统宝贵的资源,不利于性能优化。

for(int i=0; i<max; i++) {
    synchronized(lock) {    
    }
}
//改成
synchronized(lock) {
    for(int i=0; i<max; i++) {    
    }
}

public void fun() {
    synchronized(lock) {    
    }
    //其他不需要同步的工作,但可以很快执行完
    synchronized(lock) {    
    }
}
//改成
public void fun() {
    //整合成一个锁
    synchronized(lock) {    
    }
}

3、避免死锁

嵌套使用锁是死锁最主要的原因,类似下面的情况,要么是在一个方法类,要么在多个方法中相互调用。

public void fun1() {
        synchronized (obj1) {
            synchronized (obj2) {
            }
        }
}

public void fun2() {
        synchronized (obj2) {
            synchronized (obj1) {
            }
        }
}

1. 按顺序加锁
2. 使用定时锁
ReentrantLock. tryLock(long time, TimeUnit unit):在给定时间内尝试获取锁
3. 使用Semaphore
Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
4. 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
5. 使用无锁函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值