ReentrantLock说“解锁”,但第一个线程停止

时间:2013-08-22 11:12:50

标签: java concurrency reentrantlock

我们正在呼叫"锁定()"在一个ReentrantLock上,当线程显然不应该被卡在那里时。

在调用" 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();
    }

2 个答案:

答案 0 :(得分:1)

尝试在userLock.lock()之后设置断点;然后你应该得到线程,获得锁定。 或者你可以使用userLock.getOwner();紧跟在.lock()之后,看到哪个线程得到了锁定。

答案 1 :(得分:0)

问题是我的断点不是之前“lock()”就像我说的那样,但是就可以了。 发生的事情是断点会阻塞该行中的一堆线程,其中一个线程仍然会获得锁定,然后调试器会让我控制其中一个没有获得锁定的随机线程。而且我没有检查被断点阻塞的每个线程来找到自由的线程。

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

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