java:由ReentrantLock Behavior指示的线程行为

时间:2016-07-29 18:08:20

标签: java multithreading concurrency

我不理解以下代码部分中的日志:

private InfoBox getInfoBox(Path p)
{

    try
    {

        String path = p.toString();
        Log.getLogger().info("getting info box at " + path);
        lock.lock();
        Log.getLogger().info("got lock" + path);

        JAXBContext jaxbContext = JAXBContext.newInstance(InfoBox.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        InfoBox ib = (InfoBox) jaxbUnmarshaller.unmarshal(p.toFile());

        Log.getLogger().info("got info box");
        return ib;
    }
    catch (Exception e)
    {
        Log.getLogger().error(e.getMessage(), e);
        return null;

    }
    finally
    {
        lock.unlock();
        Log.getLogger().info("released lock");
    }
}

当一切运行良好时,日志条目如下所示:

  

[INFO] 2016-07-29 09:58:59,163:PersistenceThread.getInfoBox(PersistenceThread.java:618)PersistenceThread getInfoBox获取信息框位于C:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml

     

[INFO] 2016-07-29 09:58:59,179:PersistenceThread.getInfoBox(PersistenceThread.java:620)PersistenceThread getInfoBox得到lockC:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml

     

[INFO] 2016-07-29 09:58:59,203:PersistenceThread.getInfoBox(PersistenceThread.java:627)PersistenceThread getInfoBox获取信息框

     

[INFO] 2016-07-29 09:58:59,207:PersistenceThread.getInfoBox(PersistenceThread.java:639)PersistenceThread getInfoBox发布锁

但我有一个奇怪的异常

  

[INFO] 2016-07-29 09:59:16,079:PersistenceThread.getInfoBox(PersistenceThread.java:618)PersistenceThread getInfoBox获取信息框位于C:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407.xml

     

[INFO] 2016-07-29 09:59:16,084:PersistenceThread.getInfoBox(PersistenceThread.java:620)PersistenceThread getInfoBox get lockC:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407.xml

     

[INFO] 2016-07-29 10:01:36,926:PersistenceThread.getInfoBox(PersistenceThread.java:639)PersistenceThread getInfoBox发布锁

虽然获得了锁, 未检索到InfoBox 不抛出异常 但 锁定在一分钟后释放。

有人可以向我解释允许这种情况发生的基本过程吗?

最后,日志中的异常(上图)是日志文件的最后一行。之后,线程似乎完全挂起。

1 个答案:

答案 0 :(得分:1)

来自评论:

如你所述,它没有完成try块内的所有语句,也没有执行catch块。这可能意味着抛出的内容不是Exception - 类错误,例如StackOverflowErrorAssertionErrorOutOfMemoryError。 如果应用程序没有崩溃并且没有日志,那么Error可能会在应用程序的某处静默吞下,这将使调试非常困难。