銀行取錢執行緒安全問題

2021-09-23 17:08:41 字數 1301 閱讀 3787

一 定義乙個賬戶類

public class account

// 構造器

public account(string accountno , double balance)

// 此處省略了accountno和balance的setter和getter方法

// accountno的setter和getter方法

public void setaccountno(string accountno)

public string getaccountno()

// balance的setter和getter方法

public void setbalance(double balance)

public double getbalance()

// 下面兩個方法根據accountno來重寫hashcode()和equals()方法

public int hashcode()

public boolean equals(object obj)

return false;

}}

二 定義乙個取錢執行緒

public class drawthread extends thread

// 當多條執行緒修改同乙個共享資料時,將涉及資料安全問題。

public void run()

catch (interruptedexception ex)

// 修改餘額

account.setbalance(account.getbalance() - drawamount);

system.out.println("\t餘額為: " + account.getbalance());

}else

}}

三 測試主類

public class drawtest

}

四 執行

乙取錢成功!吐出鈔票:800.0

甲取錢成功!吐出鈔票:800.0

餘額為: 200.0

餘額為: -600.0

五 說明

賬戶餘額只有1000時取出1600,而且賬戶餘額出現了負數,這部是銀行希望看到的結果。

雖然上面程式是人為地使用thread.sleep(1)來強制執行緒排程切換,但這種切換是完全可能發生的。

執行緒安全問題

執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...

執行緒安全問題

是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...

執行緒安全問題

由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....