lockB.lock();
lockA.unlock();
lockB.unlock();
// The opposite order should fail (Policies.THROW).
PotentialDeadlockException firstException = null;
lockB.lock();
try {
lockA.lock();
fail("Expected PotentialDeadlockException");
} catch (PotentialDeadlockException expected) {
checkMessage(expected, "LockB -> LockA", "LockA -> LockB");
firstException = expected;
}
// Second time should also fail, with a cached causal chain.
try {
lockA.lock();
fail("Expected PotentialDeadlockException");
} catch (PotentialDeadlockException expected) {
checkMessage(expected, "LockB -> LockA", "LockA -> LockB");
// The causal chain should be cached.
assertSame(firstException.getCause(), expected.getCause());
}
// lockA should work after lockB is released.
lockB.unlock();
lockA.lock();