2011-03-23 1 views
4

У меня есть код, как это:Возможные ошибки FindBugs: UL_UNRELEASED_LOCK_EXCEPTION_PATH?

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; линию в примерочных, наконец, но, как насколько я вижу, что это не может быть плохо.

Я ошибаюсь или это ложноположительно?

+0

Кажется, что Firebug будет жаловаться на это, если вы не используете идиому, которую они задают в своих описаниях ошибок, блокируя разблокировку в блоке finally. Им, похоже, не важно, насколько ваш код находится в блокировке. – Riggy

+1

лучший вопрос, почему бы просто не использовать блок try/finally? таким образом, когда код будет реорганизован в будущем и станет более чем тривиальным назначением, у вас не будет ошибки. – jtahlborn

+0

@jtahlborn, но этот вопрос скучный :) Конечно, я добавлю попытку, наконец, но я все еще хочу знать, действительно ли это необходимо, и если да, то почему. –

ответ

5

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

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

2

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

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

Точка, которая для простой записи, указывает на то, что что-то, вероятно, неверно, это просто предупреждение неправильного.

+0

Мой пример, возможно, слишком прост. –

+0

Предположительно, 'shutdown' используется каким-то образом, но если он используется для инициирования упорядоченного отключения вашей службы,' volatile', вероятно, лучше подходит. –