Java多线程模拟银行账户并发访问:同步机制实战
Java多线程模拟银行账户并发访问:同步机制实战
本文将使用Java多线程模拟同一个单位的会计和出纳对同一银行账户进行并发访问的场景,并重点讲解如何运用同步机制避免数据不一致问题。
代码实现
public class BankAccount {
private int balance;
public BankAccount(int balance) {
this.balance = balance;
}
public int getBalance() {
return balance;
}
public synchronized void deposit(int amount) {
balance += amount;
}
public synchronized void withdraw(int amount) {
balance -= amount;
}
}
public class AccountAccess implements Runnable {
private BankAccount account;
public AccountAccess(BankAccount account) {
this.account = account;
}
public void run() {
for (int i = 0; i < 1000; i++) {
int amount = (int) (Math.random() * 100);
if (Math.random() < 0.5) {
account.deposit(amount);
} else {
account.withdraw(amount);
}
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
BankAccount account = new BankAccount(1000);
Thread accountant = new Thread(new AccountAccess(account));
Thread cashier = new Thread(new AccountAccess(account));
accountant.start();
cashier.start();
accountant.join();
cashier.join();
System.out.println('Final balance: ' + account.getBalance());
}
}
代码解析
- BankAccount类: 代表银行账户,包含余额(
balance)、存款(deposit)和取款(withdraw)方法。deposit和withdraw方法使用synchronized关键字修饰,确保同一时刻只有一个线程可以修改余额,避免竞态条件导致的数据不一致。
- AccountAccess类: 实现
Runnable接口,模拟会计和出纳的行为,随机进行存款或取款操作。 - Main类: 创建一个银行账户和两个线程(会计、出纳),启动线程并等待执行完毕,最后打印最终余额。
总结
通过上述代码示例,我们演示了如何使用Java多线程模拟并发访问银行账户的场景,并利用 synchronized 关键字确保数据一致性。在实际开发中,需要根据具体业务场景选择合适的同步机制,以保证多线程环境下数据的正确性。
原文地址: https://www.cveoy.top/t/topic/jmjm 著作权归作者所有。请勿转载和采集!