ReentrantLock에서 "lock()"을 호출하고 스레드가 분명히해서는 안되는 경우에 스레드가 멈추는 경우가 있습니다.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();
}
이럴 가능성은 희박합니다. 아마도 상태를 인쇄 한 직후에 잠금을 훔치는 다른 스레드가 활성화되어 있을까요? 잠금 장치가 잠길 수있는 가능한 모든 위치에서 디버그 메시지를 인쇄하거나 중단 점을 설정하십시오. – davmac
다른 잠금 장치가 없습니다. 그 전에 브레이크 포인트를 두었으므로 잠글 수있는 모든 스레드를 가져와야합니다. 상태를 인쇄하지 않았지만 내 스레드가 중단 점에있는 동안 디버깅 GUI에서 가져 왔습니다. – Vituel