[英]Probable false positive from Findbugs?
請參考以下代碼片段(將多余的部分切除以突出顯示有問題的情況):
FindBugs抱怨“ 方法不能在所有路徑上釋放鎖定 ”。 這是假陽性嗎? 如果沒有,該如何解決?
try{
someLock.lock();
//do something
} finally{
if (someLock.isLocked())
someLock.unlock();
}
如果isLocked()
拋出異常,那么您就不會解鎖。
我認為isLocked
引發異常,但是鎖定時必須解鎖,測試沒有意義。 那么,為什么不使用javadoc中描述的標准模式呢?
someLock.lock();
try{
//do something
} finally{
someLock.unlock();
}
所以我說
被鎖住了
查詢此鎖是否由任何線程持有。 此方法設計用於監視系統狀態, 而不用於同步控制 。
如果不是“用於同步控制”,則意味着不能保證isLocked的實現不受爭用條件的影響,即使我們已經獲取了鎖,它也可能返回false。
someLock.lock();
try{
//do something
} finally{
someLock.unlock();
}
要么
boolean locked=false;
try{
someLock.lock();
locked=true;
//do something
} finally{
if (locked) someLock.unlock();
}
這看起來像是假陽性,但我想我能理解您為什么得到它。
FindBugs規則最有可能被編碼為檢查所有路徑是否都已unlock
...,無論是否實際需要調用(從鎖定狀態的角度來看)。 它很可能不會嘗試跟蹤鎖的狀態,並且很可能不知道isLocked
含義 。 盡管您和我isLocked
,如果isLocked
返回false
,則不必調用unlock
,但並沒有實現FindBugs規則來進行此推斷。
(實際上,對於FindBugs實現者來說,在各種用例中可靠地進行推理將是一個難題。我們處於“自動定理證明”領域……)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.