Java多线程银行账户模拟:详解同步与线程安全
Java多线程银行账户模拟:详解同步与线程安全
程序概述
以下Java代码模拟了一个简单的银行账户系统,其中包含了存款、取款和查询余额等功能。程序使用多线程模拟多个用户并发操作同一个账户的情况,并通过synchronized关键字保证了线程安全。
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;
}
}
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);
}
}
}
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);
}
}
}
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());
}
}
代码解析
- BankAccount类: 代表银行账户,包含余额(
balance),以及存款(deposit)、取款(withdraw)和查询余额(getBalance)方法。 - Accountant类: 模拟会计,执行存款操作。
- Cashier类: 模拟出纳员,执行取款操作。
- Bank类: 主类,创建账户、线程并启动模拟操作。
线程安全与同步
在多线程环境下,多个线程同时操作同一个账户可能导致数据不一致的问题,例如:
- 线程A读取账户余额。
- 线程B读取账户余额。
- 线程A修改余额并写回。
- 线程B修改余额并写回。
最终,线程A的修改会被覆盖,导致数据错误。
为了解决这个问题,代码中使用synchronized关键字对BankAccount类的deposit、withdraw和getBalance方法进行了同步。这意味着,同一时间只有一个线程可以执行这些方法,其他线程需要等待锁释放才能继续执行,从而保证了线程安全。
总结
这段代码演示了如何使用Java多线程模拟银行账户操作,并通过同步机制保证了线程安全。理解多线程编程和线程安全对于开发高并发、可靠的应用程序至关重要。
原文地址: https://www.cveoy.top/t/topic/jmiS 著作权归作者所有。请勿转载和采集!