java银行多线程问题

用多线程设计模拟银行的工作情形。银行有多个窗口和取款机,用多个线程去操作一个账户存款或取款,要求取款时不能透支,如果要取的金额大于账户余额提示取款失败。每次存、取款需要打印交易时间、交易类型、窗口名以及账户目前余额。要求有简单的界面设计,常见异常情况需要提示(如余额不足等)

这种操作性问题,要写代码实现。核心就是一个账户金额的并发操作,可以加锁解决

import java.time.LocalDateTime;
import java.util.Random;
import java.util.ArrayList;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Account {
    private double _balance = 0.0;
    private Lock _mutex = new ReentrantLock(true);

    public Account(double balance) {
        _balance = balance;
    }

    public double getBalance() {
        return _balance;
    }

    public void withdraw(double amount) throws Exception {
        if (_balance < amount)
            throw new Exception("insufficient funds");
        _mutex.lock();
        _balance -= amount;
        _mutex.unlock();
    }

    public void deposit(double amount) {
        _mutex.lock();
        _balance += amount;
        _mutex.unlock();
    }
}

class Counter extends Thread {
    private String _name;
    private Account _account;

    public Counter(String name, Account account) {
        _name = name;
        _account = account;
    }

    public void withdraw(double amount) {
        try {
            _account.withdraw(amount);
            System.out.println(
                    LocalDateTime.now() + ", withdraw " + amount + ", " + _name + ", balance = "
                            + _account.getBalance());
        } catch (Exception e) {
            System.out.println("failed to withdraw due to " + e.getMessage());
        }
    }

    public void deposit(double amount) {
        _account.deposit(amount);
        System.out.println(
                LocalDateTime.now() + ", deposit " + amount + ", " + _name + ", balance = " + _account.getBalance());
    }

    public void run() {
        try {
            Random rand = new Random();
            while (true) {
                int type = rand.nextInt(2);
                int amount = rand.nextInt(100);
                if (type == 0)
                    withdraw(amount);
                else
                    deposit(amount);
                sleep(1000 + rand.nextInt(2000));
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

class Bank {
    public static void main(String[] args) {
        Account account = new Account(1000.0);
        ArrayList<Counter> counters = new ArrayList<Counter>();
        for (int i = 0; i < 5; i++)
            counters.add(new Counter("C" + i, account));
        for (int i = 0; i < 5; i++)
            counters.get(i).start();
    }
}

最简单的就是数据库条件修改余额变更,例如:update account set balance = balance - amount where balance - amount >= 0;

https://blog.csdn.net/weixin_66813230/article/details/123657726

兄弟,你这是毕设或者是实验周吧。。