65 lines
1.5 KiB
Java
65 lines
1.5 KiB
Java
package dev.banking.model;
|
|
|
|
import java.util.concurrent.locks.Lock;
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
public class BankAccount {
|
|
|
|
private final int accountId;
|
|
private long balance;
|
|
private final Lock lock = new ReentrantLock();
|
|
|
|
public BankAccount(int accountId, long initialBalance) {
|
|
this.accountId = accountId;
|
|
this.balance = initialBalance;
|
|
}
|
|
|
|
public int getAccountId() {
|
|
return accountId;
|
|
}
|
|
|
|
public long getBalance() {
|
|
lock.lock();
|
|
try {
|
|
return balance;
|
|
} finally {
|
|
lock.unlock();
|
|
}
|
|
}
|
|
|
|
public void deposit(long amount) {
|
|
lock.lock();
|
|
try {
|
|
balance += amount;
|
|
} finally {
|
|
lock.unlock();
|
|
}
|
|
}
|
|
|
|
public void withdraw(long amount) {
|
|
lock.lock();
|
|
try {
|
|
balance -= amount;
|
|
} finally {
|
|
lock.unlock();
|
|
}
|
|
}
|
|
|
|
public void transfer(BankAccount target, long amount) {
|
|
BankAccount firstLock = this.accountId < target.getAccountId() ? this : target;
|
|
BankAccount secondLock = this.accountId < target.getAccountId() ? target : this;
|
|
|
|
firstLock.lock.lock();
|
|
try {
|
|
secondLock.lock.lock();
|
|
try {
|
|
this.balance -= amount;
|
|
target.balance += amount;
|
|
} finally {
|
|
secondLock.lock.unlock();
|
|
}
|
|
} finally {
|
|
firstLock.lock.unlock();
|
|
}
|
|
}
|
|
} |