【问题标题】:ReentrantLock says "unlocked" but first thread stopsReentrantLock 说“解锁”但第一个线程停止
【发布时间】:2013-08-22 11:12:50
【问题描述】:

我们在 ReentrantLock 上调用“lock()”,而线程显然不应该被卡住。

当在调用“lock()”之前使用断点进行调试时,第一个线程将停在那里,程序指针指向“Thread.exit()”。 锁定对象的 toString() 表示“未锁定”,它的“状态”属性为“0”。 行为并不总是相同的。有时第一个线程会按预期通过锁。

    userLock.lock(); //first thread sometimes gets stuck here (and the following ones as well)
                     //"userLock" has "state=0" and toString() says "UNLOCKED"

    try {
        Transaction tr = HibernateConfig.getSessionFactory().getCurrentSession().beginTransaction();
        try {
            execute();
            tr.commit();
        } catch (ConstraintViolationException e) {
            //probably traces with repeated time
            System.err.println(e.getMessage());
            if (tr.isActive()) {
                tr.rollback();
            }
        } catch (RuntimeException e) {
            e.printStackTrace();
            if (tr.isActive()) {
                tr.rollback();
            }
        }
    } catch (Throwable e) {
        e.printStackTrace();
    } finally {
        userLock.unlock();
    }

【问题讨论】:

  • 这听起来不太可能。也许有另一个线程在你打印它的状态之后正在窃取锁?也许尝试打印调试消息或在锁可能被锁定的每个位置设置断点。
  • 没有其他锁。我们在它前面放了一个断点,所以它应该获取所有可能锁定它的线程。我没有打印状态,而是在我的线程处于断点时从调试 gui 中获取的。

标签: java concurrency reentrantlock


【解决方案1】:

尝试在 userLock.lock() 之后放置断点;那么你应该得到线程,得到锁。 或者,您可以使用 userLock.getOwner();就在 .lock() 后面,看看哪个线程获得了锁。

【讨论】:

    【解决方案2】:

    问题是我的断点不是像我说的那样“lock()”之前,而是在它上面。 发生的情况是,断点会在该行中阻塞一堆线程,其中一个仍然会获得锁,然后调试器会让我控制其中一个没有获得锁的随机线程。而且我未能检查断点阻塞的每个线程以找到空闲线程。

    最后,我实际上将断点放在锁之前,它的行为符合预期。 这很令人困惑,我希望这个问题仍然可以帮助某人。

    注意:当我控制一个锁定的线程时,我仍然对锁的状态在调试器中显示为“解锁”这一事实感到困惑。

    【讨论】:

    • 这仍然没有意义;如果你在一行上有一个断点,断点应该触发before该行执行,而不是之后。我想知道您在这里遇到的是否是一个微妙的 JVM/JPDA 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2016-07-24
    • 1970-01-01
    • 2019-08-11
    • 2023-03-21
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多