mirror of
https://github.com/github/codeql.git
synced 2025-12-20 10:46:30 +01:00
42 lines
1.0 KiB
Java
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;
|
|
}
|
|
}
|