tryLock неопубликованный ресурс

Приведенный ниже код был помечен Fortify как нарушение («неосвобожденный ресурс» для блокировки).

try {
  if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
      //do something
    }
    finally {
       lock.unlock();
   }
}
catch (InterruptedException e) {
  // something
}

Не могли бы вы объяснить, почему? Должен ли быть оператор finally для попытки/отлова InterruptedException? Я думал, что внутренняя попытка справится и с этим случаем.


person alampada    schedule 15.03.2016    source источник
comment
Это просто интерфейс Lock?   -  person John Vint    schedule 15.03.2016
comment
Я думаю, что это ошибка Fortify — код выглядит хорошо.   -  person Boris the Spider    schedule 15.03.2016
comment
@BoristheSpider Думаю, ты прав   -  person John Vint    schedule 15.03.2016


Ответы (1)


Документация Fortify описывает ошибку с невыпущенными ресурсами следующим образом:

Программа потенциально может не освободить системный ресурс.

Для вашего примера это не так. Если tryLock возвращает false или выдает исключение, блокировка не получена, блок try не введен и освобождать нечего (поэтому блок finally во внешнем блоке try не требуется). Если tryLock возвращает значение true, происходит вход во внутренний блок try и блокировка снимается в finally.

То, что у вас есть, кажется идентичным тому, как документация по API рекомендует сделать следующее:

  Lock lock = ...;
  if (lock.tryLock()) {
      try {
          // manipulate protected state
      } finally {
          lock.unlock();
      }
  } else {
      // perform alternative actions
  }

Единственное отличие состоит в том, что в вашем примере используется переопределение tryLock, время ожидания которого истекло, и в этом случае он возвращает false. Итак, из того, что опубликовано, все в порядке.

person Nathan Hughes    schedule 15.03.2016
comment
Есть еще одно ключевое отличие: локальная переменная lock. Если OP ссылается на член класса, ссылка может быть заменена, пока удерживается блокировка. - person shmosel; 26.10.2017
comment
@shmosel: это интересный момент. Но если замок заменяют, кажется, что есть проблемы похуже. - person Nathan Hughes; 26.10.2017
comment
Я не утверждаю, что это так, просто Fortify не может быть в этом уверен. - person shmosel; 26.10.2017
comment
@shmosel: определенно статический анализ кода имеет свои ограничения. - person Nathan Hughes; 26.10.2017