JD.LOCK
当通过调用 java.util.concurrent.locks.Lock.lock() 方法获得锁,但该锁实际未释放时(即,在一些路径上没有调用 java.util.concurrent.locks.Lock.unlock() 方法),发生 JD.LOCK。
漏洞与风险
这种情况会导致死锁。
缓解与预防
下面是通过锁对象实施锁定的模式:
l.lock(); try { ... } finally { l.unlock(); }
示例 1
复制
void action() {
Lock l = new ReentrantLock();
l.lock();
try {
dosomething();
} catch (Exception e) {
l.unlock();
}
}
private void dosomething() throws Exception {
// ...
}
针对第 13 行报告 JD.LOCK:获得锁“l”,但它没有释放。
示例 2
复制
void action() {
Lock l = new ReentrantLock();
l.lock();
try {
dosomething();
} catch (Exception e) {
// ...
} finally {
l.unlock();
}
}
private void dosomething() throws Exception {
// ...
}
上一代码段中的问题已修复:不管是否引发了异常,都将释放锁。此处未报告 JD.LOCK。
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。