小編給大家分享一下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如何解決銀行取錢的線程安全問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。