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();
}
以下代码已被 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();
}