Java多线程银行账户模拟:解析与代码示例

这篇博客文章将解析一个简单的Java程序,该程序利用多线程模拟银行账户的存款和取款操作。程序包含四个类,分别为BankAccountAccountantCashierBank

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()方法,程序执行流程如下:

  1. 创建一个初始余额为10000的BankAccount对象。
  2. 创建两个线程t1t2,分别对应AccountantCashier实例。
  3. 启动线程t1t2,开始模拟存款和取款操作。
  4. 使用join()方法等待两个线程执行完毕。
  5. 打印最终的账户余额。

总结:

这段代码演示了如何使用多线程模拟银行账户操作。synchronized关键字保证了depositwithdrawgetBalance方法在同一时间只会被一个线程访问,确保了数据一致性。最终的账户余额应该保持不变,因为存款和取款操作次数相等。

注意: 为了运行这段代码,您需要将每个类分别保存在以类名命名的Java文件中,例如BankAccount.javaAccountant.java等等。

Java多线程银行账户模拟:解析与代码示例

原文地址: https://www.cveoy.top/t/topic/jmja 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录