线程同步练习:两个人同时访问一个账户,一个存款,另一个取款

package day08;

import java.util.Objects;

/*
编程:假设一个银行的 ATM 机,它允许用户存款也可以取款。
    现在一个账户(Account)上存款为 200 元,
    用户 A 和用户 B 都拥有这个账户存款和取款的权利。
    用户 A 存入 100 元,而用户 B 将取出 50 元,
    则最终账户的存款应为 250 元。
为了模拟以上过程,描述如下:
    (1)定义一个 Account 类,属性为账户名(userName)和余额(balance),类进行封装
    (2)线程 ThreadA 负责存钱操作;线程 ThreadB 负责取钱操作;
    (3)main 函数中负责开启两个线程,并将存取操作结束之后的账户余额进行打印输出
 */
//创建ATM类
class Account{
    private String userName;
    private Double balance;
    @Override
    public String toString() {
        return "Account{" +
                "userName='" + userName + '\'' +
                ", balance=" + balance +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Account account = (Account) o;
        return Objects.equals(userName, account.userName) && Objects.equals(balance, account.balance);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userName, balance);
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Double getBalance() {
        return balance;
    }

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

    public Account(String userName, Double balance) {
        this.userName = userName;
        this.balance = balance;
    }

    public Account() {
    }
}

//创建线程类ThreadA,继承Thread类,实现run方法
class ThreadA extends Thread{
    //创建任务对象
    private Account a;
    //构造方法
    public ThreadA(){}
    public ThreadA(Account a){
        this.a=a;
    }
    //实现run方法:存100块
    public void run(){
        //线程同步
        synchronized (a){
            //存钱100元
            System.out.println("余额为:" + a.getBalance());
            System.out.println("存钱金额:100");
            //调用对象a方法存款
            a.setBalance(a.getBalance()+100);
            //输出结果
            System.out.println("当前余额:" + a.getBalance());
        }
    }
}
class ThreadB extends Thread{
    //创建任务对象,封装
    private Account a;
    //构造方法
    public ThreadB(){}
    public ThreadB(Account a){
        this.a=a;
    }
    //实现run方法 取款
    public void run(){
        synchronized (a){
            System.out.println("余额为:"+a.getBalance());
            System.out.println("取款50元");
            //调用取款方法
            a.setBalance(a.getBalance()-50);
            //输出结果
            System.out.println("当前余额:" + a.getBalance());

        }
    }
}
public class Test19 {
    public static void main(String[] args) {
        //创建任务对象
        Account a = new Account("Mario的账户",200D);
        //用任务对象为参数,创建线程对象存款t1
        Thread t1 = new ThreadA(a);
        //用任务对象为参数,创建线程对象取款t2
        Thread t2 = new ThreadB(a);
        //启动线程
        t2.start();
        t1.start();

    }
}

上一篇:交换机链路聚合模式说明


下一篇:MySQL_事务