线程同步:银行帐户存、取款问题
来源:互联网 发布:易学大师宝宝取名软件 编辑:程序博客网 时间:2024/05/05 08:41
1.银行账户类
package com.bankAccount.test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Account {//显式定义Lock对象private final Lock lock=new ReentrantLock(); //获得指定Lock对象对应的Conditionprivate final Condition cond=lock.newCondition();//封装账户编号,账户余额的两个成员变量private String accoutNo;private double balance;//标识账户中是否已有存款的旗标private boolean flag=false;public Account(){}//构造器public Account(String accountNo,double balance){this.accoutNo=accountNo;this.balance=balance;}public String getAccoutNo() {return accoutNo;}public void setAccoutNo(String accoutNo) {this.accoutNo = accoutNo;}//因为账户余额不可以随便修改,所以只为balance提供getter方法public double getBalance() {return this.balance;}public void draw(double drawAmount){//加锁lock.lock();try{if(!flag){cond.await();}else{//执行取钱操作System.out.println(Thread.currentThread().getName()+"取钱:"+drawAmount);balance-=drawAmount;System.out.println("账户余额为:"+balance);//将标识账户是否已有存款的旗标设为falseflag=false;//唤醒其他进程cond.signalAll();}}catch(InterruptedException ex){ex.printStackTrace();}finally{lock.unlock();}}public void deposit(double depositAmount){lock.lock();try{//如果flag为真,表明账户中已经有人存钱进去,存钱方法阻塞if(flag){cond.await();}else{//执行存款操作System.out.println(Thread.currentThread().getName()+"存款:"+depositAmount);balance+=depositAmount;System.out.println("账户余额为:"+balance);//将表示是否已有存款的旗标设为trueflag=true;//唤醒其他线程cond.signalAll();}}catch(InterruptedException ex){ex.printStackTrace();}finally{lock.unlock();}}public int hashCode(){return accoutNo.hashCode();}public boolean equals(Object obj){if(this==obj)return true;if(obj!=null&&obj.getClass()==Account.class){Account target=(Account)obj;return target.getAccoutNo().equals(accoutNo);}return false;}}
2.存款线程
package com.bankAccount.test;public class DepositThread extends Thread{private Account account;//当前存款线程所希望存的钱数private double depositAmount;public DepositThread(String name,Account account,double depositAmount){super(name);this.account=account;this.depositAmount=depositAmount;}public void run(){for(int i=0;i<100;i++){account.deposit(depositAmount);}}}
3.取款线程
package com.bankAccount.test;public class DrawThread extends Thread{//模拟用户账户private Account account;//当前取钱线程所希望取的钱数private double drawAmount;public DrawThread(String name,Account account,double drawAmount){super(name);this.account=account;this.drawAmount=drawAmount;}//当多个线程修改同一个共享数据时,将涉及数据安全问题public void run(){//使用account作为同步监视器,任何线程进入下面同步代码块之前//必须先获得对account账户的锁定---其他线程无法获得锁,也就无法修改它//该做法符合:"加锁->修改->释放锁"for(int i=0;i<100;i++){account.draw(drawAmount);}}}4.测试类
package com.bankAccount.test;public class DrawTest {public static void main(String[] args) {//创建一个账户Account acct=new Account("123",0);//模拟两个线程对同一个账户取 钱new DrawThread("取钱者",acct,800).start();new DepositThread("存款者甲",acct,800).start();new DepositThread("存款者乙",acct,800).start();new DepositThread("存款者丙",acct,800).start();}}
结果:
0 0
- 线程同步:银行帐户存、取款问题
- java 线程同步问题之银行存取款问题
- java 银行存取款模型的线程同步问题
- java线程存取款
- java学习7:银行存取款的例子,主要涉及对象同步问题,类似于数据库存取款,数据一致性问题
- Java线程之银行存取款
- 多个线程之间共享数据的方式(卖票问题,存取款问题)
- Thread 线程之 银行账户多窗口存取款实现
- 银行取款[多线程]{使用同步方法确保线程同步}
- 银行取款[多线程]{使用同步代码块确保线程同步}
- 多线程互斥锁问题(多线程模拟银行存取款)
- java多线程问题中简单的存取款实现
- Java--银行账户存取款线程设计1(交互线程)
- Java--银行存取款线程设计2(线程互斥)
- 关于取款问题 java同步简单的小例子
- [C#]存取款异常提醒
- 银行ATM存取款机
- 银行ATM机存取款
- 饥荒mod工具的编译
- PyMongo基本使用
- DOM中表单操作
- ym—— Android 5.0学习之使用Palette
- Linux必学的60个命令
- 线程同步:银行帐户存、取款问题
- BZOJ2115 Xor
- python实现的各种排序算法代码
- Python中ini文件的读写操作
- 学习C/C++步骤,C/C++编程成功的方法
- html5之video标签
- 【数值积分】 ZOJ 3832 Tilt Cylinder
- 图像处理算法工程师(索贝公司)
- 单系统显示grub启动菜单