多執行緒的同步問題

2022-05-06 17:48:14 字數 1663 閱讀 2304

看乙個例子,背景是,銀行卡裡有1000塊錢,在櫃檯取800塊錢,在提款機取800塊錢,理論上來說,這個是不允許的

看看實現**

1

package

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條執行緒訪問,就解決了

**如下:

1

package

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...