達內課程 執行緒的安全問題

2021-08-20 11:41:29 字數 4238 閱讀 2914

執行緒的死鎖

例如我們用執行緒模擬乙個取錢過程

bank類

public

class

bank

person類

public

class

person

extends

thread

@override

public

void

run(

)}

test

public

class

test

}

執行結果

我開始取錢,當前餘額:5000

我取錢結束,當前餘額:1000

剛才是正常情況下的取錢,如果2個人同時取錢會怎樣

test

public

class

test

}

執行結果

我開始取錢,當前餘額:5000

媽媽開始取錢,當前餘額:5000

媽媽取錢結束,當前餘額:1000

我取錢結束,當前餘額:-3000

我們加乙個判斷會不會好一點 呢

person

public

class

person

extends

thread

@override

public

void

run(

)else

}}

執行結果

媽媽開始取錢,當前餘額:5000

我開始取錢,當前餘額:5000

媽媽取錢結束,當前餘額:1000

我取錢失敗

執行多次可能出錯,為了增加出錯機率,修改**:

person

public

class

person

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)

bank.count-=

4000

; system.out.

println

(getname()

+"取錢結束,當前餘額:"

+bank.count);}

else

}}

執行結果

我開始取錢,當前餘額:5000

媽媽開始取錢,當前餘額:5000

我取錢結束,當前餘額:1000

媽媽取錢結束,當前餘額:-3000

原因由於是2個執行緒交替執行,執行過程如下圖所示,可能 紅色執行緒執行到判斷bank.account>=4000,判斷通過了,就停下切換到了藍色執行緒,而藍色執行緒也執行到判斷bank.account>=4000,由於餘額並沒有減少,所以判斷也通過了,所以會減少2次。所以即使我們加了判斷也是沒有用的

而且我們增加了thread.sleep(1);程式的錯誤就必然出現,紅色執行緒執行到bank.account>=4000,就sleep,換藍色執行緒執行bank.account>=4000,2次判斷都通過了,程式必然出錯

想解決這個問題我們希望if(){}這段語句能整體一次性執行

使用synchronized互斥鎖可以解決執行緒的安全問題,**如下:

public

class

person

extends

thread

public

static object lock =

newobject()

;@override

public

void

run(

)catch

(interruptedexception e)

bank.count-=

4000

; system.out.

println

(getname()

+"取錢結束,當前餘額:"

+bank.count);}

else}}

}

絕對靠譜的鎖可以在裡邊放乙個字串

synchronized

("hello_world"

);

或者保證變數前有static

public

static object lock =

newobject()

;

不可以用乙個變數存乙個字串,因為每new乙個新物件,字串變數也會new乙個,也可能程式執行過程中這個字串會進行運算而改變值

當然也可以這樣實現,但這樣的前提是implements runnable介面

synchronized

(this

)

person

public

class

person

implements

runnable

public string getname()

public

static object lock =

newobject()

;@override

public

void

run(

)else}}

}

test

public

class

test

}

如果使用

synchronized

(this

)

當然也可以這麼寫:

模擬乙個死鎖

deadlockthread

public

class

deadlockthread

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)

synchronized

(lock2)}}

else

catch

(interruptedexception e)

synchronized

(lock1)}}

}}

test

public

class

test

}

執行結果

程式就會卡住,一直執行不完

這種巢狀的鎖會出現死鎖

執行緒安全問題

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

執行緒安全問題

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

執行緒安全問題

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