【发布时间】:2016-02-18 17:03:36
【问题描述】:
我试图在一个帐户上执行多个存款/取款交易的经典银行余额问题。
我已经同步了账户类中的两个方法,只有加入所有线程(等待执行完成),执行结束时账户余额为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());
//}
}
}
【问题讨论】:
-
如果 (a) 有一条规则不允许任何线程看到负余额,并且 (b) 线程会先取款,然后暂停,然后存钱。
-
是的,正确..在我的情况下会更有趣或更令人困惑:D。我只是想知道这在现实世界中是如何工作的。
标签: java multithreading concurrency