您好,登錄后才能下訂單哦!
小編給大家分享一下Java如何解決銀行取錢的線程安全問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
一 定義一個賬戶類
public class Account { // 封裝賬戶編號、賬戶余額的兩個成員變量 private String accountNo; private double balance; public Account(){} // 構(gòu)造器 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; } // 下面兩個方法根據(jù)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; // 當(dāng)前取錢線程所希望取的錢數(shù) private double drawAmount; public DrawThread(String name , Account account , double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } // 當(dāng)多條線程修改同一個共享數(shù)據(jù)時,將涉及數(shù)據(jù)安全問題。 public void run() { // 賬戶余額大于取錢數(shù)目 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) { // 創(chuàng)建一個賬戶 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,而且賬戶余額出現(xiàn)了負數(shù),這部是銀行希望看到的結(jié)果。
雖然上面程序是人為地使用Thread.sleep(1)
來強制線程調(diào)度切換,但這種切換是完全可能發(fā)生的。
以上是“Java如何解決銀行取錢的線程安全問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。