CodeQL 文档

未释放锁

ID: java/unreleased-lock
Kind: problem
Security severity: 5.0
Severity: error
Precision: medium
Tags:
   - reliability
   - security
   - external/cwe/cwe-764
   - external/cwe/cwe-833
Query suites:
   - java-security-extended.qls
   - java-security-and-quality.qls

单击查看 CodeQL 代码库中的查询

当线程获取锁时,它必须确保再次解锁;未能这样做会导致死锁。如果锁允许线程多次获取它,例如 java.util.concurrent.locks.ReentrantLock,则锁的数量必须与解锁的数量匹配才能完全释放锁。

建议

建议的做法是始终在调用 lock 后立即使用 try 块,并将调用 unlock 放置在 finally 块中。注意 finally 块中的调用可能会导致异常,因为这可能导致跳过对 unlock 的调用。

示例

安全使用锁的典型模式如下所示

public void m() {
   lock.lock();
   // A
   try {
      // ... method body
   } finally {
      // B
      lock.unlock();
   }
}

如果在 AB 处插入任何可能导致方法过早退出的代码(例如通过抛出异常),则该方法可能无法解锁,因此应避免这样做。

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私