您好,登錄后才能下訂單哦!
這篇文章主要講解了“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銀行取錢線程安全問題實例講解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。