Высокопроизводительный дизайн приложения Springboot Banking - PullRequest
0 голосов
/ 04 октября 2018

Я пытался сделать проект, включающий многопоточность, в 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);

    }
}

1 Ответ

0 голосов
/ 04 октября 2018

Вместо синхронизации по всему методу вы можете выполнить синхронизацию с этим конкретным «accountNum» следующим образом:

 public void doWithdrawal(int accNum) {
    synchronized(accountMap.get(accNum)) {
        // now perform withdrawal
    }
 }

Таким образом, вы будете синхронизироваться, только если номер учетной записи совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...