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