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