锁的使用优化
一、加锁和释放没有配对: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、数据库层面:如果有插入操作,建议设置唯一索引,在数据库层面能增加一层安全保障;
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~