看乙個例子,背景是,銀行卡裡有1000塊錢,在櫃檯取800塊錢,在提款機取800塊錢,理論上來說,這個是不允許的
看看實現**
1package
test;23
public
class
fetchmoney
1516}17
18class
bank
2627
if(money > this
.money)
3031
try catch
(exception e)
3637
this.money -=money;
38return
money;39}
40}4142
class moneythread extends
thread
4950
@override
51public
void
run()
54 }
執行的結果是
800
800process finished with exit code 0
1000塊錢的餘額居然真的取出2次800塊錢了
問題的根源在於,2個執行緒會同時訪問乙個例項的某個成員變數,2條執行緒判斷條件時成員變數的值均可能是還沒取錢時候的值
要解決這個問題,我們可以這麼想,取錢的時候(即調getmoney方法的時候),只允許1條執行緒訪問,就解決了
**如下:
1package
test;23
public
class
fetchmoney
1718}19
20class
bank
2829
if(money > this
.money)
3233
try catch
(exception e)
3839
this.money -=money;
40return
money;41}
4243
public
int getmoney2(int
money)
4950
if (money > this
.money)
5354
try catch
(exception e)
5960
this.money -=money;61}
62return
money;63}
64}6566
class moneythread extends
thread
7374
@override
75public
void
run()
78 }
呼叫getmoney或者getmoney2都可以
結果為:
800
-2process finished with exit code 0
多執行緒同步問題
在應用程式中使用多個執行緒的乙個好處是每個執行緒都可以非同步執行。對於 windows 應用程式,耗時的任務可以在後台執行,而使應用程式視窗和控制項保持響應。對於伺服器應用程式,多執行緒處理提供了用不同執行緒處理每個傳入請求的能力。否則,在完全滿足前乙個請求之前,將無法處理每個新請求。然而,執行緒的...
多執行緒同步問題
有四個執行緒1,2,3,4,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.現在有四個檔案.abcd.初始都為空.現要讓四個檔案呈如下格式 a 1 2 3 4 1 2.b 2 3 4 1 2 3.c 3 4 1 2 3 4.d 4 1 2 3 4 1.設計程式.include sys ...
多執行緒 同步問題
我們先看個錯誤示例。功能 宣告乙個數字並賦值10000.然後讓1w個執行緒去減少1,1w個執行緒去增加1。理論上說,加一萬減一萬,最後數字的結果並不會改變。class errordemo 釋放object的方法 synchronized 塊結束或者異常丟擲。使用synchronized後的 publ...