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);
}
--存取款都是用线程来控制
注意:这里程序设计中没考虑账户金额不足的问题,这里只考虑了对操作对象的同步问题。
对共享对象操作的类、代码块 要加上 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
- java学习7:银行存取款的例子,主要涉及对象同步问题,类似于数据库存取款,数据一致性问题
- java 银行存取款模型的线程同步问题
- java 线程同步问题之银行存取款问题
- 关于取款问题 java同步简单的小例子
- 线程同步:银行帐户存、取款问题
- 用JAVA的多线程实现银行取款的问题
- java多线程问题中简单的存取款实现
- 多线程互斥锁问题(多线程模拟银行存取款)
- C#学习笔记--关于银行存取款的小实验
- 【Java】银行中用户存取款业务的实现
- Java多线程银行存取款程序
- Java线程之银行存取款
- c#04-02编写异常处理,实现银行存取款过程中可能遇到的问题
- 用JAVA中的多线程示例银行取款问题
- 多个线程之间共享数据的方式(卖票问题,存取款问题)
- 银行ATM存取款机
- 银行ATM机存取款
- [多线程之一]-NSThread银行取款问题
- [leetcode] 3 Longest Substring Without Repeating Characters
- Unity3D教你制作Bezier和Spine曲线编辑器二
- ubuntu解压命令全览(rar)
- Android四大组件及其联系纽带Intent
- Command line tools for Machine learning
- java学习7:银行存取款的例子,主要涉及对象同步问题,类似于数据库存取款,数据一致性问题
- bootstrap中好看的文件上传样式
- SurfaceView surface SurfaceHolder制作简单的相机
- mysql索引总结----mysql 索引类型以及创建
- PAT 1051. Pop Sequence (25) 栈
- myeclipse反编译插件jad的安装
- teamviewer vpn + win7 vpn 创建远程访问内网环境
- javascript中的location.href页面挑战
- debug案例---下拉列表框选择查询字段后,没有显示结果。