下面的代码已被Fortify标记为违规(锁的“未释放资源”)
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描述为:
对于您的示例而言,这是不正确的。如果tryLock返回false或引发异常,则没有获得锁,没有输入try块,也没有要释放的内容(因此,外部try块中不需要finally块)。如果tryLock返回true,则进入内部try块,并最终释放锁。
您所拥有的似乎与API documentation建议您执行的操作相同:
Lock lock = ...;
if (lock.tryLock()) {
try {
// manipulate protected state
} finally {
lock.unlock();
}
} else {
// perform alternative actions
}
唯一的区别是您的示例使用了tryLock的覆盖,该覆盖超时,在这种情况下它将返回false。因此,从发布的内容来看,这似乎还可以。