2016-07-29 20 views
1

我不从下面的代码段理解日志: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 锁被释放一分钟后。

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

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

+5

在调用'getInfoBox()'的方法中发生了什么?因为'Error' throwable不会被该异常处理程序捕获并导致线程崩溃。 (也许这是一个StackOverflowError或OutOfMemoryError) – Kiskae

+1

一个快速的评论(这可能不是你的问题的原因),但你应该将这些行移动到'try.lock()'调用上面'block - 如果因为某种原因你在调用'lock.lock()'之前抛出一个异常,并且你的'finally'块试图解锁它,你将会抛出额外的'IllegalMonitorStateException'。 – CodeBlind

+0

@Kiskae,谢谢。我正在记录JVM内存。没有内存问题(演出备用)。尽管如此,你还是可以做点什么!我将检查我的异常处理。 – Jake

回答

1

从评论:

正如你说,它并没有完成所有的语句try块中,并没有执行catch块。这可能意味着抛出了一些不是Exception级别的错误,例如StackOverflowError,AssertionErrorOutOfMemoryError。 如果应用程序没有崩溃并且没有日志,那么Error可能在应用程序的某个地方被悄悄地吞噬,这将使得这非常难以调试。

+0

我现在正试图在每个线程运行方法结束时捕获(错误错误)。这是在多线程应用程序中捕获错误的最合适的地方吗? – Jake

+1

你可能不应该捕捉错误,因为它们通常是不可恢复的。记录意外的异常应该通过'Thread.setUncaughtExceptionHandler(...)'方法完成。只需在线程开始工作之前设置一个处理程序。 – Kiskae

+0

gotcha .....虽然我没有重新抛出一次记录错误...忘了提及 – Jake