我们正在呼叫"锁定()"在一个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();
}
答案 0 :(得分:1)
尝试在userLock.lock()之后设置断点;然后你应该得到线程,获得锁定。 或者你可以使用userLock.getOwner();紧跟在.lock()之后,看到哪个线程得到了锁定。
答案 1 :(得分:0)
问题是我的断点不是之前“lock()”就像我说的那样,但是就可以了。 发生的事情是断点会阻塞该行中的一堆线程,其中一个线程仍然会获得锁定,然后调试器会让我控制其中一个没有获得锁定的随机线程。而且我没有检查被断点阻塞的每个线程来找到自由的线程。
最后我将断点实际上放在锁之前,它的行为符合预期。 这令人困惑,我希望这个问题仍能帮助别人。
注意:当我控制一个锁定的线程时,我仍然对调试器中锁的状态说“解锁”的事实感到困惑。