Java银行取钱线程安全问题实例分析
本文实例讲述了Java银行取钱线程安全问题。分享给大家供大家参考,具体如下:
一定义一个账户类
publicclassAccount { //封装账户编号、账户余额的两个成员变量 privateStringaccountNo; privatedoublebalance; publicAccount(){} //构造器 publicAccount(StringaccountNo,doublebalance) { this.accountNo=accountNo; this.balance=balance; } //此处省略了accountNo和balance的setter和getter方法 //accountNo的setter和getter方法 publicvoidsetAccountNo(StringaccountNo) { this.accountNo=accountNo; } publicStringgetAccountNo() { returnthis.accountNo; } //balance的setter和getter方法 publicvoidsetBalance(doublebalance) { this.balance=balance; } publicdoublegetBalance() { returnthis.balance; } //下面两个方法根据accountNo来重写hashCode()和equals()方法 publicinthashCode() { returnaccountNo.hashCode(); } publicbooleanequals(Objectobj) { if(this==obj) returntrue; if(obj!=null &&obj.getClass()==Account.class) { Accounttarget=(Account)obj; returntarget.getAccountNo().equals(accountNo); } returnfalse; } }
二定义一个取钱线程
publicclassDrawThreadextendsThread { //模拟用户账户 privateAccountaccount; //当前取钱线程所希望取的钱数 privatedoubledrawAmount; publicDrawThread(Stringname,Accountaccount ,doubledrawAmount) { super(name); this.account=account; this.drawAmount=drawAmount; } //当多条线程修改同一个共享数据时,将涉及数据安全问题。 publicvoidrun() { //账户余额大于取钱数目 if(account.getBalance()>=drawAmount) { //吐出钞票 System.out.println(getName() +"取钱成功!吐出钞票:"+drawAmount); try { Thread.sleep(1); } catch(InterruptedExceptionex) { ex.printStackTrace(); } //修改余额 account.setBalance(account.getBalance()-drawAmount); System.out.println("\t余额为:"+account.getBalance()); } else { System.out.println(getName()+"取钱失败!余额不足!"); } } }
三测试主类
publicclassDrawTest { publicstaticvoidmain(String[]args) { //创建一个账户 Accountacct=newAccount("1234567",1000); //模拟两个线程对同一个账户取钱 newDrawThread("甲",acct,800).start(); newDrawThread("乙",acct,800).start(); } }
四运行
乙取钱成功!吐出钞票:800.0
甲取钱成功!吐出钞票:800.0
余额为:200.0
余额为:-600.0
五说明
账户余额只有1000时取出1600,而且账户余额出现了负数,这部是银行希望看到的结果。
虽然上面程序是人为地使用Thread.sleep(1)来强制线程调度切换,但这种切换是完全可能发生的。
更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。