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类: 主类,创建账户、线程并启动模拟操作。

线程安全与同步

在多线程环境下,多个线程同时操作同一个账户可能导致数据不一致的问题,例如:

  1. 线程A读取账户余额。
  2. 线程B读取账户余额。
  3. 线程A修改余额并写回。
  4. 线程B修改余额并写回。

最终,线程A的修改会被覆盖,导致数据错误。

为了解决这个问题,代码中使用synchronized关键字对BankAccount类的depositwithdrawgetBalance方法进行了同步。这意味着,同一时间只有一个线程可以执行这些方法,其他线程需要等待锁释放才能继续执行,从而保证了线程安全。

总结

这段代码演示了如何使用Java多线程模拟银行账户操作,并通过同步机制保证了线程安全。理解多线程编程和线程安全对于开发高并发、可靠的应用程序至关重要。

Java多线程银行账户模拟:详解同步与线程安全

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

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