我有这样的代码:
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 :(得分:5)
公平地说,它通常相当棘手(没有完整的编译器并进行分析)来确定任何给定的代码片段是否可以抛出异常。
但我同意,在这种情况下,这是误报。即使它不是 - 即使JLS / JVM规范的某个黑暗角落说某个分配可以,不知何故,通过异常 - 如果你进入那个状态,你需要更多的担心而不是un发布了锁!
答案 1 :(得分:2)
这是真的,但在这里使用锁是错误的事实。您只需要volatile
。
事实上你甚至不需要它,因为你从未读过这个值,所以你可以完全忽略变量和锁。
指出,对于简单的写入,findbugs警告可能是正确的,它只是警告错误的东西。