温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java银行取钱线程安全问题实例讲解

发布时间:2021-09-08 18:42:26 来源:亿速云 阅读:140 作者:chen 栏目:编程语言

这篇文章主要讲解了“Java银行取钱线程安全问题实例讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java银行取钱线程安全问题实例讲解”吧!

本文实例讲述了Java银行取钱线程安全问题。分享给大家供大家参考,具体如下:

一 定义一个账户类

public class Account{   // 封装账户编号、账户余额的两个成员变量   private String accountNo;   private double balance;   public Account(){}   // 构造器   public Account(String accountNo , double balance)   {      this.accountNo = accountNo;      this.balance = balance;   }   // 此处省略了accountNo和balance的setter和getter方法   // accountNo的setter和getter方法   public void setAccountNo(String accountNo)   {      this.accountNo = accountNo;   }   public String getAccountNo()   {      return this.accountNo;   }   // balance的setter和getter方法   public void setBalance(double balance)   {      this.balance = balance;   }   public double getBalance()   {      return this.balance;   }   // 下面两个方法根据accountNo来重写hashCode()和equals()方法   public int hashCode()   {      return accountNo.hashCode();   }   public boolean equals(Object obj)   {      if(this == obj)        return true;      if (obj !=null        && obj.getClass() == Account.class)      {        Account target = (Account)obj;        return target.getAccountNo().equals(accountNo);      }      return false;   }}

二 定义一个取钱线程

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()   {      // 账户余额大于取钱数目      if (account.getBalance() >= drawAmount)      {        // 吐出钞票        System.out.println(getName()           + "取钱成功!吐出钞票:" + drawAmount);        try        {           Thread.sleep(1);        }        catch (InterruptedException ex)        {           ex.printStackTrace();        }        // 修改余额        account.setBalance(account.getBalance() - drawAmount);        System.out.println("\t余额为: " + account.getBalance());      }      else      {        System.out.println(getName() + "取钱失败!余额不足!");      }   }}

三 测试主类

public class DrawTest{   public static void main(String[] args)   {      // 创建一个账户      Account acct = new Account("1234567" , 1000);      // 模拟两个线程对同一个账户取钱      new DrawThread("甲" , acct , 800).start();      new DrawThread("乙" , acct , 800).start();   }}

四 运行

乙取钱成功!吐出钞票:800.0甲取钱成功!吐出钞票:800.0 余额为: 200.0 余额为: -600.0

五 说明

账户余额只有1000时取出1600,而且账户余额出现了负数,这部是银行希望看到的结果。

虽然上面程序是人为地使用Thread.sleep(1)来强制线程调度切换,但这种切换是完全可能发生的。

感谢各位的阅读,以上就是“Java银行取钱线程安全问题实例讲解”的内容了,经过本文的学习后,相信大家对Java银行取钱线程安全问题实例讲解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI