Files
codeql/java/ql/test/query-tests/security/CWE-833/semmle/tests/ReentrantLockOrder.java
2018-08-30 10:48:05 +01:00

42 lines
1.0 KiB
Java

import java.util.concurrent.locks.ReentrantLock;
class ReentrantLockOrder {
private int primaryAccountBalance;
private final ReentrantLock primaryLock = new ReentrantLock();
private int savingsAccountBalance;
private final ReentrantLock savingsLock = new ReentrantLock();
public boolean transferToSavings(int amount) {
try {
primaryLock.lock();
savingsLock.lock();
if (amount>0 && primaryAccountBalance>=amount) {
primaryAccountBalance -= amount;
savingsAccountBalance += amount;
return true;
}
} finally {
savingsLock.unlock();
primaryLock.unlock();
}
return false;
}
public boolean transferToPrimary(int amount) {
// AVOID: lock order is different from "transferToSavings"
// and may result in deadlock
try {
savingsLock.lock();
primaryLock.lock();
if (amount>0 && primaryAccountBalance>=amount) {
primaryAccountBalance -= amount;
savingsAccountBalance += amount;
return true;
}
} finally {
primaryLock.unlock();
savingsLock.unlock();
}
return false;
}
}