0

我们在 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();
    }
4

2 回答 2

1

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

于 2013-08-22T13:39:02.473 回答
0

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

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

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

于 2013-08-22T15:23:49.670 回答