tryLock 未释放的资源

tryLock unreleased resource

以下代码已被 Fortify 标记为违规("unreleased resource" 锁)

try {
  if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
      //do something
    }
    finally {
       lock.unlock();
   }
}
catch (InterruptedException e) {
  // something
}

你能解释一下为什么吗? InterruptedException try/catch 是否应该有一个 finally 语句?我认为内部尝试也可以处理这种情况。

Fortify 文档将 unreleased resource bug 描述为:

The program can potentially fail to release a system resource.

您的示例并非如此。如果 tryLock returns false 或抛出异常,则不会获取任何锁,不会进入 try 块,也不会释放任何内容(因此外部 try 块中不需要 finally 块)。如果 tryLock returns 为真,则进入内部 try 块并在 finally.

中释放锁

您所拥有的似乎与 API documentation 建议您执行此操作的方式相同:

  Lock lock = ...;
  if (lock.tryLock()) {
      try {
          // manipulate protected state
      } finally {
          lock.unlock();
      }
  } else {
      // perform alternative actions
  }

唯一的区别是您的示例使用超时的 tryLock 重写,在这种情况下它 returns 为 false。所以从发布的内容来看,这似乎没问题。

我可能有一个不错的解决方案:

long timeout = ...;
Lock someLock = ...;
try {
    if (!someLock.tryLock(timeout, TimeUnit.MILLISECONDS)) {
        // TODO: print some error;
        return;
    }
} catch (InterruptedException e) {
    // TODO: print some error;
    return;
}

try{
    // TODO: Some Logic
} finally {
    someLock.unlock();
}