我有一个看起来像这样的类:
class Foo {
final ReadWriteLock lock = new ReentrantReadWriteLock();
Object read() {
lock.readLock().lock();
Object result;
try {
result = getResource();
} finally {
lock.readLock().unlock();
}
return result;
}
}
Fortify 标记方法 read
与 Unreleased Resource: Synchronization
, 声称已获得锁,然后在不释放锁的情况下直接退出该方法。
我的预感是,自从 lock
字段是接口(interface)类型 ReadWriteLock
, Fortify 无法分辨 lock.readLock()
保证返回相同的 Lock
两个调用的对象。因此,Fortify 看到 Lock
我们锁定的没有存储在局部变量中,它认为 Lock
因此丢失和泄漏。这是正确的吗?
最佳答案
我的预感是正确的。 Fortify 无法判断 lock.readLock()
为这两个调用返回相同的 Lock
对象,并将锁存储在 final
局部变量中解决了问题。
关于java - 为什么 Fortify 将其标记为未发布的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121774/