中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

日喀则市| 岳阳市| 永年县| 巩义市| 丽水市| 陈巴尔虎旗| 望谟县| 龙口市| 武清区| 醴陵市| 乌兰察布市| 甘德县| 盐亭县| 无极县| 大田县| 仪陇县| 张家口市| 泌阳县| 太白县| 虎林市| 驻马店市| 韶山市| 綦江县| 富顺县| 青川县| 宝丰县| 华容县| 青浦区| 黄浦区| 五台县| 运城市| 沾益县| 阳新县| 虎林市| 太白县| 西峡县| 甘孜| 醴陵市| 堆龙德庆县| 旬邑县| 仙游县|