У меня есть класс, который выглядит так:
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
имеет тип интерфейса ReadWriteLock
, Fortify не может сказать, что lock.readLock()
гарантированно возвращает один и тот же объект Lock
для обоих вызовов. Итак, Fortify видит, что заблокированный нами Lock
не хранится в локальной переменной, и думает, что Lock
, таким образом, теряется и утекает. Это правильно?