我不明白以下代码部分的日志:
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 getting info box at C:\Users\jake_000_filedump_infoBoxes\AccountExecutive1469777154904.xml
[INFO] 2016-07-29 09:58:59,179: PersistenceThread.getInfoBox(PersistenceThread.java:620) PersistenceThread getInfoBox got lockC:\Users\jake_000_filedump_infoBoxes\AccountExecutive1469777154904.xml
[INFO] 2016-07-29 09:58:59,203: PersistenceThread.getInfoBox(PersistenceThread.java:627) PersistenceThread getInfoBox got info box
[INFO] 2016-07-29 09:58:59,207: PersistenceThread.getInfoBox(PersistenceThread.java:639) PersistenceThread getInfoBox released lock
但是我有一个奇怪的异常
[INFO] 2016-07-29 09:59:16,079: PersistenceThread.getInfoBox(PersistenceThread.java:618) PersistenceThread getInfoBox getting info box at C:\Users\jake_000_filedump_infoBoxes\AccountExecutive1469778628407.xml
[INFO] 2016-07-29 09:59:16,084: PersistenceThread.getInfoBox(PersistenceThread.java:620) PersistenceThread getInfoBox got lockC:\Users\jake_000_filedump_infoBoxes\AccountExecutive1469778628407.xml
[INFO] 2016-07-29 10:01:36,926: PersistenceThread.getInfoBox(PersistenceThread.java:639) PersistenceThread getInfoBox released lock
注意 虽然获得了锁, 未检索到信息框 不抛出异常 但 一分钟后锁被释放。
有人可以向我解释一下允许这种情况发生的底层流程吗?
最后,日志中的异常(上图)是日志文件的最后一行。之后线程似乎完全挂起。
最佳答案
来自评论:
正如您所说,它没有完成 try
中的所有语句。阻止并没有执行catch
堵塞。这可能意味着抛出的东西不是 Exception
类错误,例如 StackOverflowError
, AssertionError
或OutOfMemoryError
。
如果应用程序没有崩溃并且没有日志,则 Error
可能会在应用程序的某个地方默默地被吞噬,这将使调试变得非常困难。
关于java:由 ReentrantLock 行为指示的线程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38665040/