下面的代码被Fortify标记为违规("未发布的资源"锁定)
try {
if (lock.tryLock(1, TimeUnit.SECONDS)) {
try {
//do something
}
finally {
lock.unlock();
}
}
catch (InterruptedException e) {
// something
}
你能解释一下原因吗?是否应该有针对InterruptedException的finally语句try / catch?我认为内部尝试也会处理这种情况。
答案 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。所以从发布的内容来看,这似乎没问题。