云迈博客

您现在的位置是:首页 > 后端开发 > Java > 正文

Java

锁的使用优化

lin2021-05-06Java515
一、加锁和释放没有配对:lock与unlock通常结对使用,使用时,一般将unlock放在finally代码块中。但是释放锁时最好增加判断:if(lock.isHeldByCurrentThr

一、加锁和释放没有配对:
lock 与 unlock 通常结对使用,使用时,一般将unlock放在finally代码块中。但是释放锁时最好增加判断:
if (lock.isHeldByCurrentThread()) lock.unlock();
这样避免锁持有超时后释放引发IllegalMonitorStateException异常。

如果怕忘记释放锁,可以将锁封装成一个代理模式,如下:
public class AutoUnlockProxy implements Closeable {

private Lock lock;

public AutoUnlockProxy(Lock lock){
    this.lock = lock;
}

public void lock(){
    lock.lock();
}

public boolean tryLock(){
    return lock.tryLock();
}

@Override
public void close() throws IOException {
    lock.unlock();
}

}

使用时,通过try-with-resource 的方式使用,可以达到自动释放锁的目的:
try(AutoUnlockProxy proxy = new AutoUnlockProxy(new ReentrantLock())){
proxy.lock();
}catch (Exception e){
e.printStackTrace();
}

二、锁自动释放导致的重复逻辑执行(补充的细节点)
1、代码层面:对请求进行验重;
2、数据库层面:如果有插入操作,建议设置唯一索引,在数据库层面能增加一层安全保障;

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~