Java開發之執行緒同步造成的執行緒死鎖

2021-09-01 12:05:49 字數 974 閱讀 5047

兩個人面對面過獨木橋,甲和乙都已經在橋上走了一段距離,即占用了橋的資源,甲如果想通過獨木橋的話,乙必須退出橋面讓出橋的資源,讓甲通過,但是乙不服,為什麼讓我先退出去,我還想先過去呢,於是就僵持不下,導致誰也過不了橋,這就是死鎖。

1.互斥條件(只有乙個冠軍):乙個資源每次只能被乙個程序使用。獨木橋每次只能通過乙個人。

2.請求與保持條件(互不相讓):乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。乙不退出橋面,甲也不退出橋面。

3.不剝奪條件(平等優先順序): 程序已獲得的資源,在未使用完之前,不能強行剝奪。甲不能強制乙退出橋面,乙也不能強制甲退出橋面。

4.迴圈等待條件(敵退我進,敵進我退):若干程序之間形成一種頭尾相接的迴圈等待資源關係。如果乙不退出橋面,甲不能通過,甲不退出橋面,乙不能通過。

package deadlock;

public class deadlocktest

}class lock implements runnable

@override

public void run()

}} catch (exception e) }}

結果:

原因分析:巢狀的同步語句時造成死鎖的原因,對方沒有讓出己方的過橋資源,兩者都不可以獲得對方的資源。

1.避免乙個執行緒同時獲取多個鎖。

2.避免在乙個資源內占用多個 資源,盡量保證每個鎖只占用乙個資源。

3.嘗試使用定時鎖,使用trylock(timeout)來代替使用內部鎖機制。

4.對於資料庫鎖,加鎖和解鎖必須在乙個資料庫連線裡,否則會出現解鎖失敗的情況。

5.避免同步巢狀的發生

java執行緒同步之CountDownLatch

1 類說明 jdk的concurrent包中的countdownlatch類是乙個執行緒同步的輔助類,它使得執行緒可以一直等待在其它執行緒中執行的操作,直到此操作結束。countdownlatch在初始化的時候指定乙個大小值n,呼叫countdownlatch的await方法的執行緒會陷入等待之中,...

java執行緒同步之synchronized

同步指的是呼叫乙個方法時,在沒有得到結果之前,這個呼叫就不返回。執行緒同步的意思與之類似,但執行緒同步並不是說讓乙個執行緒執行完了再執行其它執行緒,一般是指讓執行緒中的某一些操作進行同步就可以。執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進...

java學習之協調同步的執行緒

當乙個執行緒使用的同步方法中用到某個變數,而此變數有需要其他執行緒修改後才能符合本執行緒的需要,那麼可以在同步方法中使用wait wait方法可以中斷執行緒的執行,使本執行緒等待,暫時讓出cpu的使用權,並允許其他執行緒使用這個同步方法。其他執行緒如果在使用這個同步方法時,不許需要等待,那麼它使用這...