java学习7:银行存取款的例子,主要涉及对象同步问题,类似于数据库存取款,数据一致性问题

来源:互联网 发布:打电话变声的软件 编辑:程序博客网 时间:2024/05/16 15:15
银行存取款的例子,主要涉及对象同步问题,类似于数据库存取款,数据一致性问题。
--存取款都是用线程来控制


注意:这里程序设计中没考虑账户金额不足的问题,这里只考虑了对操作对象的同步问题。
      对共享对象操作的类、代码块 要加上 synchronized 关键字


代码如下:
Bank类:
package com.imooc.bank;


public class Bank {
    private String account;//账号
    private int balance;//余额


    public Bank(String account, int balance) {
        this.account = account;
        this.balance = balance;
    }


    public String getAccount() {
        return account;
    }


    public void setAccount(String account) {
        this.account = account;
    }


    public int getBalance() {
        return balance;
    }


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


    @Override
    public String toString() {
        return "Bank[" +
                "账号 : " + account +
                " 余额 : " + balance +
                ']';
    }


    public synchronized void  saveAccount(){
        //可以在不同位置添加sleep
        //获取当前账号余额
        int balance = getBalance();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //修改余额,存100元
        balance+=100;
        //修改账户余额
        setBalance(balance);
        //输出存款后余额
        System.out.println("存款后的账户余额为: "+balance);
    }
    public  void drawAccount(){
        synchronized (this) {
            //在不同的位置添加sleep方法
            //获取当前账户余额
            int balance = getBalance();
            //修改,取出200;
            balance = balance - 200;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //修改账户余额
            setBalance(balance);
            System.out.println("取款后的账户余额: " + balance);
        }
    }
}


存钱的Runnable接口对象:
package com.imooc.bank;


//存款
public class SaveAccount implements Runnable {
    Bank bank;


    public SaveAccount(Bank bank) {
        this.bank = bank;
    }


    @Override
    public void run() {
        bank.saveAccount();
    }
}


取钱的Runnable接口对象:
package com.imooc.bank;


public class DrawAccount implements Runnable {
    Bank bank;


    public DrawAccount(Bank bank) {
        this.bank = bank;
    }


    @Override
    public void run() {
        bank.drawAccount();
    }
}


主类:
package com.imooc.bank;


public class Test {
    public static void main(String[] args) {
        //创建账户,给定余额1000
        Bank bank = new Bank("10001", 1000);
        //创建线程对象
        SaveAccount sa = new SaveAccount(bank);
        DrawAccount da = new DrawAccount(bank);
        Thread save = new Thread(sa);
        Thread draw = new Thread(da);


        draw.start();
        save.start();


        try {
            draw.join();
            save.join();


        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(bank);


    }

}

感谢慕课网

阅读全文
0 0
原创粉丝点击