2011-03-23 2 views
4

다음과 같은 코드가 있습니다.UL_UNRELEASED_LOCK_EXCEPTION_PATH의 가능한 FindBugs 오 탐지?

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

그리고 FindBugs는 "Thingy.shutdown()이 모든 예외 경로에서 잠금을 해제하지 않는다"고 불평하고 try-finally에서 shutdown = true; 행을 래핑해야한다고하지만 내가 볼 수 있듯이 이것이 나빠질 수있는 방법은 없습니다.

잘못 되었습니까? 아니면 거짓입니까?

+0

Firebug는 버그 설명에서 지정하는 관용구를 사용하지 않으면 파이어 버그가 불만을 제기하는 것처럼 보이며 finally 블록에서 잠금을 해제합니다. 그들은 코드가 잠금 블록에 얼마나 간단한 지 신경 쓰지 않는 것 같습니다. – Riggy

+1

더 나은 질문은 try/finally 블록을 사용하지 않는 이유는 무엇입니까? 그런 식으로 코드가 미래에 리팩토링되고 사소한 과제 이상이되면 버그가 발생하지 않습니다. – jtahlborn

+0

@jtahlborn하지만 그 질문은 지루하다. :) try-finally를 추가 할 것이 틀림 없다. 그러나 나는 그것이 정말로 필요한지, 그리고 그렇다면 왜 필요로하는지 아직도 알고 싶다. –

답변

5

공평하게 말하자면, 주어진 코드 조각이 예외를 던질 수 있는지 여부를 결정하는 것은 일반적으로 상당히 까다 롭습니다 (전체 컴파일러가 아니며 분석을하지 않는 경우).

하지만 동의합니다.이 경우 거짓 긍정입니다. JLS/JVM 스펙의 일부 어두운 부분이 있어도 할당을 할 수 있다고 말하는 예외가 있더라도 예외는 아닙니다. 해당 상태가되면 un union보다 걱정할 필요가 있습니다. - 잠금 해제!

2

사실이지만 여기에 자물쇠를 사용하는 것이 잘못된 것입니다. volatile 만 있으면됩니다.

실제로 값을 읽지 않아도 필요하지 않으므로 변수와 잠금을 모두 삭제할 수 있습니다.

포인트는 간단한 쓰기의 경우 findbugs 경고가 맞을 가능성이 큽니다. 잘못된 것만 경고합니다.

+0

제 예제는 지나치게 간단합니다. –

+0

아마도 'shutdown'이 어떻게 든 사용되지만 서비스를 정상적으로 종료하는 데 사용된다면 'volatile'이 실제로 더 적합 할 것입니다. –