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

xiaoxiao2021-02-28  133

银行存取款的例子,主要涉及对象同步问题,类似于数据库存取款,数据一致性问题。 --存取款都是用线程来控制 注意:这里程序设计中没考虑账户金额不足的问题,这里只考虑了对操作对象的同步问题。       对共享对象操作的类、代码块 要加上 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);     }

}

感谢慕课网

转载请注明原文地址: https://www.6miu.com/read-20059.html

最新回复(0)