我不从下面的代码段理解日志:Java语言:ReentrantLock的行为表示线程行为
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");
}
}
当所有运行良好,日志条目显示如下:
[信息] 2016-07-29 09:58:59,163:PersistenceThread.getInfoBox(PersistenceThread.java:618)PersistenceThread getInfoBox获取信息框在C:\ Users \ jake_000_filedump_infoBoxes \ AccountExecutive1469777154904.xml
[INFO] 2016年7月29日09:58:59179:PersistenceThread.getInfoBox(PersistenceThread.java:620)PersistenceThread getInfoBox得到lockC:\用户\ 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年7月29日09:59:16079:中C PersistenceThread.getInfoBox(PersistenceThread.java:618)PersistenceThread getInfoBox获取信息框:\用户\ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407 .XML
[INFO] 2016年7月29日09:59:16084:PersistenceThread.getInfoBox(PersistenceThread.java:620)PersistenceThread getInfoBox得到lockC:\用户\ jake_000_filedump_infoBoxes \ AccountExecutive1469778628407.xml
[INFO] 2016-07-29 10:01:36,926:PersistenceThread.getInfoBox(PersistenceThread.java:639)Per sistenceThread getInfoBox释放锁
注 虽然获取锁, 的资讯盒没有检索 一种不引发异常 BUT 锁被释放一分钟后。
有人可以向我解释允许这种情况发生的基本过程吗?
最后,日志(上面)中的异常是日志文件的最后一行。之后,线程似乎完全挂起。
在调用'getInfoBox()'的方法中发生了什么?因为'Error' throwable不会被该异常处理程序捕获并导致线程崩溃。 (也许这是一个StackOverflowError或OutOfMemoryError) – Kiskae
一个快速的评论(这可能不是你的问题的原因),但你应该将这些行移动到'try.lock()'调用上面'block - 如果因为某种原因你在调用'lock.lock()'之前抛出一个异常,并且你的'finally'块试图解锁它,你将会抛出额外的'IllegalMonitorStateException'。 – CodeBlind
@Kiskae,谢谢。我正在记录JVM内存。没有内存问题(演出备用)。尽管如此,你还是可以做点什么!我将检查我的异常处理。 – Jake