Возможные ложные срабатывания FindBugs UL_UNRELEASED_LOCK_EXCEPTION_PATH? - PullRequest
4 голосов
/ 23 марта 2011

У меня есть такой код:

public class Thingy {
  private final Lock lock = new ReentrantLock();
  private boolean shutdown;
  public void shutdown() {
    lock.lock();
    shutdown = true;
    lock.unlock();
  }
}

И FindBugs жалуется, что «Thingy.shutdown () не снимает блокировку на всех путях исключений» и что я должен обернуть строку shutdown = true; в попытке-Наконец, но, насколько я могу судить, это никак не может испортиться.

Я ошибаюсь или это ложно-положительный результат?

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

Чтобы быть справедливым, обычно довольно сложно (не будучи полноценным компилятором и не выполнять анализ), чтобы определить, может ли какой-то конкретный кусок кода вызвать исключение.

Но я согласен, вв этом случае это ложный положительный результат.И даже если это не так - даже если есть какой-то темный угол спецификации JLS / JVM, в котором говорится, что назначение может каким-то образом через исключение - если вы войдете в это состояние, вам придется больше беспокоиться, чем не-выпущенный замок!

2 голосов
/ 24 марта 2011

Это правда, но тот факт, что использование блокировки здесь не так. Вам нужно только volatile.

На самом деле вам это даже не нужно, поскольку вы никогда не читаете значение, поэтому вы можете исключить переменную и блокировку в целом.

Дело в том, что для простой записи findbugs, предупреждающий о чем-то, вероятно, верен, просто предупреждает о неправильной вещи.

...