Java多线程银行账户模拟:解析与代码示例
Java多线程银行账户模拟:解析与代码示例
这篇博客文章将解析一个简单的Java程序,该程序利用多线程模拟银行账户的存款和取款操作。程序包含四个类,分别为BankAccount、Accountant、Cashier和Bank。
1. BankAccount 类:
public class BankAccount {
private int balance;
public BankAccount(int initialBalance) {
balance = initialBalance;
}
public synchronized void deposit(int amount) {
balance += amount;
}
public synchronized void withdraw(int amount) {
balance -= amount;
}
public synchronized int getBalance() {
return balance;
}
}
BankAccount类代表一个银行账户,包含以下内容:
balance:一个私有整型变量,表示账户余额。BankAccount(int initialBalance):构造函数,用于初始化账户余额。deposit(int amount):一个同步方法,用于向账户存款。withdraw(int amount):一个同步方法,用于从账户取款。getBalance():一个同步方法,用于获取当前账户余额。
2. Accountant 类:
public class Accountant implements Runnable {
private BankAccount account;
public Accountant(BankAccount account) {
this.account = account;
}
public void run() {
for (int i = 0; i < 10000; i++) {
account.deposit(1);
}
}
}
Accountant类代表一个会计,负责向账户存款。它实现了Runnable接口,表示该类可以作为线程执行。run()方法中循环执行10000次存款操作。
3. Cashier 类:
public class Cashier implements Runnable {
private BankAccount account;
public Cashier(BankAccount account) {
this.account = account;
}
public void run() {
for (int i = 0; i < 10000; i++) {
account.withdraw(1);
}
}
}
Cashier类代表一个出纳员,负责从账户取款。它也实现了Runnable接口,run()方法中循环执行10000次取款操作。
4. Bank 类:
public class Bank {
public static void main(String[] args) {
BankAccount account = new BankAccount(10000);
Thread t1 = new Thread(new Accountant(account));
Thread t2 = new Thread(new Cashier(account));
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println('Final balance: ' + account.getBalance());
}
}
Bank类包含主程序入口main()方法,程序执行流程如下:
- 创建一个初始余额为10000的
BankAccount对象。 - 创建两个线程
t1和t2,分别对应Accountant和Cashier实例。 - 启动线程
t1和t2,开始模拟存款和取款操作。 - 使用
join()方法等待两个线程执行完毕。 - 打印最终的账户余额。
总结:
这段代码演示了如何使用多线程模拟银行账户操作。synchronized关键字保证了deposit、withdraw和getBalance方法在同一时间只会被一个线程访问,确保了数据一致性。最终的账户余额应该保持不变,因为存款和取款操作次数相等。
注意: 为了运行这段代码,您需要将每个类分别保存在以类名命名的Java文件中,例如BankAccount.java,Accountant.java等等。
原文地址: https://www.cveoy.top/t/topic/jmja 著作权归作者所有。请勿转载和采集!