Files
HW-09-Advanced-Multithreading/src/main/java/dev/banking/model/BankAccount.java
T
2026-06-29 16:44:04 +03:30

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();
}
}
}