EN JP CN

JD.LOCK

JD.LOCK

JD.LOCK は、java.util.concurrent.locks.Lock.lock() メソッドの呼び出しでロックが獲得された後、解除されていない場合に発生します。すなわち、java.util.concurrent.locks.Lock.unlock() メソッドがいずれかのパスで呼び出されていません。

脆弱性とリスク

この状況はデッドロックの原因となる可能性があります。

軽減と防止

Lock オブジェクトでロックを実装するパターンを以下に示します。

l.lock();

try { 
   ...
 } finally {
   l.unlock(); 
}

例 1

12     void action() {
13         Lock l = new ReentrantLock();
14         l.lock();
15         try {
16             dosomething();
17         } catch (Exception e) {
18             l.unlock();
19         }
20     }
21 
22     private void dosomething() throws Exception {
23         // ...
24     }

JD.LOCK が 13 行目に対して報告されています。ロック 'l' が獲得されましたが、解除されていません。

例 2

11     void action() {
12         Lock l = new ReentrantLock();
13         l.lock();
14         try {
15             dosomething();
16         } catch (Exception e) {
17             // ...
18         } finally {
19             l.unlock();
20         }
21     }
22 
23     private void dosomething() throws Exception {
24         // ...
25     }

例 1 のスニペットの問題を修正しました:ロックは、例外がスローされたかどうかにはかかわらず解除されます。フィールドは、JD.LOCK は報告されていません。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。