2011-03-23 43 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()不能在所有異常路徑釋放鎖」,我應該換行shutdown = true;線在一個try-finally,但作爲就我所見,這是不可能的。

我錯了還是這是假陽性?

+0

它看起來像螢火蟲會抱怨,除非你使用成語他們在錯誤描述指定,解開包裹在finally塊。他們似乎並不在意你的代碼在鎖定塊中有多簡單。 – Riggy 2011-03-23 17:33:42

+1

更好的問題,爲什麼不使用try/finally塊?這樣當代碼在將來被重構並且變得不僅僅是一個簡單的任務時,你就不會有錯誤。 – jtahlborn 2011-03-23 17:53:02

+0

@jtahlborn但這個問題很無聊:)我確定我會添加try-finally,但我仍然想知道它是否真的需要,如果是這樣,爲什麼。 – 2011-03-23 18:33:02

回答

5

爲了公平起見,它通常是相當棘手(而不全的編譯器和做分析)來確定的代碼任何給定的片段是否能拋出異常與否。

但我同意,在這種情況下,這是一個假陽性。即使不是這樣 - 即使JLS/JVM規範的某個黑暗角落說某個分配可以在某種程度上通過一個例外 - 如果你進入該狀態,你就會擔心得比un釋放的鎖!

2

其真實的,但這樣的事實是,這裏使用的鎖是錯誤的事情。你只需要volatile

事實上,你甚至都不需要,當你沒讀過的價值,所以你完全可以的Elid變量和鎖。

點是,對於一個簡單的寫,FindBugs的警告我可能是正確的,它只是警告錯誤的事情。

+0

我的例子可能過於簡單。 – 2011-03-24 16:49:58

+0

假設「關機」以某種方式使用,但如果它用於啓動服務的有序關閉,「volatile」確實可能更適合。 – 2011-08-30 21:46:18