账户类
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);
}
}
转账的时候,此处可以开启一个事务,使俩个操作都在一个事务中,要么一起成功要么一起失败,可以使用数据库的事务特性 ,如果失败了,事务进行回滚操作,成功将事务提交,
最后:
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。