gpt4 book ai didi

java - 处理现实世界中银行交易的并发请求

转载 作者:行者123 更新时间:2023-12-01 10:22:27 25 4
gpt4 key购买 nike

典型的银行余额问题,我试图在一个帐户上执行多个存款/取款交易。

我已经同步了account类中的两个方法,只有加入所有线程(等待执行完成),执行结束时账户余额才为500。

因此,我正在考虑一个现实世界的场景,其中每个请求都会生成一个新线程来执行事务并返回余额。由于同一帐户上有其他线程在运行,因此每次报告的余额是否不正确?

这是代码:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;


class Account {

private int balance = 0;


Account(int bal){
this.balance =bal;
}

public int getBal() {
return balance;
}


public synchronized void withdraw(int bal){
balance = balance - bal;
}

public synchronized void deposit(int bal){
balance = balance + bal;
}
}

public class TransactionManagerNaiveSync implements Runnable {

Account account;

public TransactionManagerNaiveSync(Account a){
this.account = a;
}
public static void main(String[] args) {

long start = System.currentTimeMillis();
Account a1 = new Account(500);
TransactionManagerNaiveSync t1 = new TransactionManagerNaiveSync(a1);

List<Thread> thread = new ArrayList<Thread>();
for(int i=0;i < 300;i++) thread.add(new Thread(t1));
for(int i=0;i < 300;i++) thread.get(i).start();
for(int i=0;i < 300;i++){
try {
thread.get(i).join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

long end = System.currentTimeMillis();
System.out.println(" Account Balance in the end : "+ a1.getBal());
System.out.println(" Time Taken : "+(end - start));
}



@Override
public void run() {

//for(int i=0;i < 100;i++)
//{
account.deposit(10);
System.out.println(""+Thread.currentThread().getId()+" Account Balance after deposit : "+account.getBal());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

account.withdraw(10);
System.out.println(""+Thread.currentThread().getId()+" Account Balance after withdrawal : "+account.getBal());
//}

}

}

最佳答案

余额可能不正确,因为您没有同步 Account.getBal() ,这意味着您可能无法获得最新值,因为内存可见性保证无法对多个线程更新的变量进行非同步访问。

简单标记方法synchronized .

如果您将余额存储为 AtomicInteger 也会更容易(而且几乎肯定会更高效)而不是int ,因为您不需要 synchronize那么根本就没有。

关于java - 处理现实世界中银行交易的并发请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35487874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com