91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

会东县| 克山县| 高清| 城固县| 土默特右旗| 大田县| 邢台县| 怀安县| 呼伦贝尔市| 馆陶县| 高安市| 临洮县| 普陀区| 望城县| 罗平县| 嫩江县| 南汇区| 西华县| 鹤壁市| 仙游县| 沾益县| 延安市| 论坛| 镇巴县| 莫力| 清远市| 和田市| 马公市| 黔东| 琼海市| 霍林郭勒市| 赤水市| 渭源县| 安庆市| 蓬溪县| 义马市| 治多县| 乐陵市| 瑞丽市| 图木舒克市| 德阳市|