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