银行用户账户有一个金额属性,请实现存钱,取钱,转账三个功能,并演示并发场景下,银行账户A和账户B之间互相转账1元的情景

2 篇文章 0 订阅
2 篇文章 0 订阅

账户类


public class Account {
    private String user;//用户名
    private String passcode;//密码
    private double balance;//余额
    private Lock lock;
    private Condition condition;

    public Account(String user, String passcode, double balance) {
        this.user = user;
        this.passcode = passcode;
        this.balance = balance;
        lock = new ReentrantLock();
        condition = lock.newCondition();
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPasscode() {
        return passcode;
    }

    public void setPasscode(String passcode) {
        this.passcode = passcode;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    /**
     * 存钱
     *
     * @param money
     */
    public void savemoney(double money) {
        lock.lock();
        try {
            balance += money;
            System.out.println(String.format("%s存了%f元,账户余额为%s元", user, money, balance));
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 取钱
     *
     * @param money
     */
    public void drawmoney(double money) {
        lock.lock();
        try {
            if (money > balance) {
                System.out.println("账户余额不足,无法取钱");
                condition.await();

            }
            balance -= money;
            System.out.println(String.format("%s取了%f元,账户余额为%s元", user, money, balance));
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 显示账户信息
     */
    public void show() {
        System.out.println(String.format("用户名字%s 账户余额%s", user,balance));
    }
}

银行类

public class Bank {
    public String BankName;
    private ArrayList<Account> account;

    public Bank(String bankName) {
        this.BankName = bankName;
        account = new ArrayList<Account>();
    }

    public Bank(String BankName, ArrayList<Account> account) {
        this.BankName = BankName;
        this.account = account;
    }


    /***
     * 开账户
     * @param user
     * @param passcode
     * @param money
     */
    public void openAccount(String user, String passcode, double money) {
        account.add(new Account(user, passcode, money));
    }

    /**
     * 查找账户按用户名,若找到,返回该账户,否则,返回null
     *
     * @param username
     * @return
     */
    public Account seekAccount(String username) {
        Optional<Account> first = account.stream().filter(var -> username.equals(var.getUser())).findFirst();
        if (first.isPresent()) {
            return first.get();
        }
        return null;
    }


    /**
     * 显示该用户账户信息
     *
     * @param userName
     */
    public void showAccount(String userName) {
        Account account = seekAccount(userName);
        if (account == null) {
            System.out.println("该账户不存在。");
        } else {
            account.show();
        }
    }


    /**
     * 显示该用户账户信息
     *
     * @param userName
     * @param money
     */
    public void saveMoney(String userName, double money) {
        Account account = seekAccount(userName); //查找
        if (account == null) {
            System.out.println("该账户不存在。");
        } else {
            account.savemoney(money);
            this.showAccount(userName);
        }
    }


    /**
     * 从特定账户取钱,需验证密码
     *
     * @param userName
     * @param money
     * @param password
     */
    public void drawMoney(String userName, double money, String password) {
        Account account = seekAccount(userName); //查找
        if (account == null) {
            System.out.println("该账户不存在。");
        } else {
            if (password.equals(account.getPasscode())) {
                account.drawmoney(money);

                this.showAccount(userName);
            } else {
                System.out.println("密码不正确,取钱失败。");
            }
        }
    }


    public void transfer(String userName, String password, String userName2, double money) {
        Account account = seekAccount(userName); //查找
        if (account == null) {
            System.out.println("该账户不存在。");
        }
        Account account2 = seekAccount(userName2); //查找
        if (account2 == null) {
            System.out.println("转账账户不存在。");
        }
        try {
            //开启事务
            if (password.equals(account.getPasscode())) {
                account.drawmoney(money);
                account2.savemoney(money);
            }
        } finally {

        }
    }

}

测试

public class Test {

    public static void main(String[] args) {

        Bank bank = new Bank("中国银行");
        bank.openAccount("测试1", "111111", 1);
        bank.openAccount("测试2", "222222", 1);
        //存钱
        bank.saveMoney("测试1", 1000);

        //从特定账户取钱,需验证密码
        bank.drawMoney("测试1", 1000, "111111");



        //存钱
        bank.saveMoney("测试2", 10000);

        //密码错误,取钱失败的情况
        bank.drawMoney("测试2", 20000, "222222");

        //转账
        bank.transfer("测试1","666666","测试2",1);


    }

}

转账的时候,此处可以开启一个事务,使俩个操作都在一个事务中,要么一起成功要么一起失败,可以使用数据库的事务特性 ,如果失败了,事务进行回滚操作,成功将事务提交,
最后:

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值