Я пытался сделать проект, включающий многопоточность, в Springboot.
В приложении Банка я могу выполнять такие операции, как doWithdrawal()
как synchronized
, чтобы поддерживать целостность учетной записи,но я не могу понять, как это сделать только на определенном уровне учетной записи.
Поскольку пользователи с разными номерами учетных записей должны иметь возможность осуществлять снятие одновременно, с моим текущим кодом doWithdrawal()
выполнит все операциисинхронизируется независимо от номера счета.
В настоящее время у меня есть очень базовая функциональность ниже, где я использовал при снятии средств с один счет как операция synchronized
.Я хочу сценарий, в котором разные владельцы аккаунтов могут одновременно снимать со своего собственного аккаунта , но, хотя несколько операций снятия с одного аккаунта одновременно, только этот процесс должен быть синхронным.
Я ищу здесь то, как приложение должно быть спроектировано, чтобы иметь такую функциональность. Я знаю, что мы можем использовать @Async
для асинхронных операций, но не уверен, как это будет соответствовать сценарию, когда снятие с одной и той же учетной записи должно быть синхронным, но другимдолжен быть асинхронным.
Account.java
public class Account {
int number ;
float currentBalance ;
float openingBalance ;
String accountHolder ;
String branch ;
float rateOfInterest ;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public float getCurrentBalance() {
return currentBalance;
}
public void setCurrentBalance(float currentBalance) {
this.currentBalance = currentBalance;
}
public float getOpeningBalance() {
return openingBalance;
}
public void setOpeningBalance(float openingBalance) {
this.openingBalance = openingBalance;
}
public String getAccountHolder() {
return accountHolder;
}
public void setAccountHolder(String accountHolder) {
this.accountHolder = accountHolder;
}
public String getBranch() {
return branch;
}
public void setBranch(String branch) {
this.branch = branch;
}
public float getRateOfInterest() {
return rateOfInterest;
}
public void setRateOfInterest(float rateOfInterest) {
this.rateOfInterest = rateOfInterest;
}
}
App.java
public class App {
public static void main(String[] args) {
BankService.openAccount(1001);
Thread2 t2 = new Thread2();
Thread3 t3 = new Thread3();
Thread4 t4 = new Thread4();
t2.start();
t3.start();
t4.start();
}
}
class Thread2 extends Thread {
BankService bs = BankService.getInstance();
public void run(){
System.out.println("bs instrance is"+bs.hashCode());
bs.doWithdrawal(200, 1001);
}
}
class Thread3 extends Thread {
BankService bs = BankService.getInstance();
public void run(){
System.out.println("bs instrance is"+bs.hashCode());
bs.doWithdrawal(100, 1001);
}
}
class Thread4 extends Thread {
BankService bs = BankService.getInstance();
public void run(){
System.out.println("bs instrance is"+bs.hashCode());
bs.doWithdrawal(100, 1001);
}
}
BankService.java
import java.util.HashMap;
import java.util.Map;
public class BankService {
private static BankService bankService ;
private BankService(){
}
public static BankService getInstance(){
if(bankService==null){
return bankService = new BankService();
}
return bankService;
}
static Map<Integer,Account> accountMap = new HashMap<Integer, Account>();
public void doDeposit(float amount,int accountNum){
Account acc = accountMap.get(accountNum);
acc.setCurrentBalance(acc.getCurrentBalance()+amount);
System.out.println("made deposit");
System.out.println("account : "+acc.getNumber()+" "+acc.getCurrentBalance());
}
public synchronized void doWithdrawal(float amount,int accountNum){
Account acc = accountMap.get(accountNum);
acc.setCurrentBalance(acc.getCurrentBalance()-amount);
System.out.println("account : "+acc.getNumber()+" "+acc.getCurrentBalance());
}
public void checkBalance(int accountNumber){
}
public static void openAccount(int accnum){
Account acc = new Account();
acc.setCurrentBalance(2000);
acc.setNumber(1001);
accountMap.put(acc.getNumber(), acc);
System.out.println("obj is"+accountMap);
}
}