java - 高性能 Springboot 银行应用程序设计
问题描述
我试图在springboot中做一个涉及多线程的项目。
在银行应用程序中,我可以进行类似doWithdrawal()
assynchronized
的操作以保持帐户的完整性,但我无法弄清楚如何仅在特定帐户级别进行操作。
由于不同账号的用户应该可以同时进行提款,所以我现在的代码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);
}
}
解决方案
您可以在特定的“accountNum”上同步,而不是同步整个方法,如下所示:
public void doWithdrawal(int accNum) {
synchronized(accountMap.get(accNum)) {
// now perform withdrawal
}
}
这样,您将仅在帐号相同时进行同步。
推荐阅读
- python - 在 Pycharm 退出代码 0 中使用生命线绘制 KMF 曲线但没有输出
- python - 在 Python 中使用 try 和 except 来捕获负输入的异常
- css - 使用 AdminLTE 和 yii2FullCalendar 的布局 css 和视图 css 之间的模态冲突
- ios - 有没有办法在整个应用程序中更改 UILabel 行间距,例如使用 UIAppearance 或类似的东西
- javascript - 动态添加输入 - 更新项目数量后的总价格
- c++ - 无法从向量返回指针
- kubernetes - 无法在 Pod 中挂载本地目录
- java - 弹簧执行器“/auditevents”端点返回 404
- lua - Lua:未使用“math.random”生成的值
- python - Pandas:使用字典中元组的列标题和单元格值创建数据框