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 分析。