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

标签 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 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 , AssertionErrorOutOfMemoryError 。 如果应用程序没有崩溃并且没有日志,则 Error可能会在应用程序的某个地方默默地被吞噬,这将使调试变得非常困难。

关于java:由 ReentrantLock 行为指示的线程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38665040/

相关文章:

java - 为什么我的多线程代码会导致挂起?

java - 如何将用户帐户信息从 Wordpress 获取到 JApplet

Java UTF-16 字符串始终使用 4 个字节而不是 2 个字节

c++ - 异步过程调用

c - 信号量和并发编程

java - 为什么 Java Concurrency In Practice list 5.18 不能用锁自动完成?

java - 将数据库中的数据显示到 TextView 中 (Android)

java 密码学 BigInteger - 生成素数 q 来查找素数 P =2q+1,完成 - 现在如何生成并确认原根 g?

c# - 不断检查服务器是否正在使用C#监听给定的端口

python - python中的线程: retrieve return value when using target=