UL_UNRELEASED_LOCK_EXCEPTION_PATH可能的FindBugs误报?

时间:2011-03-23 17:03:29

标签: java concurrency thread-safety 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;行,但据我所知,没有这可能会变坏。

我错了还是假阳性?

2 个答案:

答案 0 :(得分:5)

公平地说,它通常相当棘手(没有完整的编译器并进行分析)来确定任何给定的代码片段是否可以抛出异常。

但我同意,在这种情况下,这是误报。即使它不是 - 即使JLS / JVM规范的某个黑暗角落说某个分配可以,不知何故,通过异常 - 如果你进入那个状态,你需要更多的担心而不是un发布了锁!

答案 1 :(得分:2)

这是真的,但在这里使用锁是错误的事实。您只需要volatile

事实上你甚至不需要它,因为你从未读过这个值,所以你可以完全忽略变量和锁。

指出,对于简单的写入,findbugs警告可能是正确的,它只是警告错误的东西。