tryLock未发布的资源

时间:2016-03-15 19:00:57

标签: java multithreading concurrency locking fortify

下面的代码被Fortify标记为违规("未发布的资源"锁定)

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

你能解释一下原因吗?是否应该有针对InterruptedException的finally语句try / catch?我认为内部尝试也会处理这种情况。

1 个答案:

答案 0 :(得分:4)

Fortify文档将unreleased resource bug描述为:

  

程序可能无法释放系统资源。

对于你的例子来说,这不是真的。如果tryLock返回false或抛出异常,则没有获取锁定,则不会输入try块,并且没有任何内容可以释放(因此外部try-block中不需要finally块)。如果tryLock返回true,则输入内部try块并在finally中释放锁。

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

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

唯一的区别是你的例子使用超时的tryLock覆盖,在这种情况下它返回false。所以从发布的内容来看,这似乎没问题。