1. 程式人生 > >#Java中活鎖和死鎖有什麼區別?如何避免死鎖?

#Java中活鎖和死鎖有什麼區別?如何避免死鎖?

Java中活鎖和死鎖是指什麼,你知道他們之間的區別嗎,下面我們可以來討論一下: 如果有想要學習java的小夥伴,可來我們的java學習扣裙哦:72340,3928裡面贈送java系列教學視訊和資料!小編也是從事了6年java開發的全棧工程師,歡迎初學者和想要進階的同學進來一起學習。 在這裡插入圖片描述 Java中活鎖和死鎖有什麼區別?

活鎖:一個執行緒通常會有會響應其他執行緒的活動。如果其他執行緒也會響應另一個執行緒的活動,那麼就有可能發生活鎖。同死鎖一樣,發生活鎖的執行緒無法繼續執行。然而執行緒並沒有阻塞——他們在忙於響應對方無法恢復工作。這就相當於兩個在走廊相遇的人:甲向他自己的左邊靠想讓乙過去,而乙向他的右邊靠想讓甲過去。可見他們阻塞了對方。甲向他的右邊靠,而乙向他的左邊靠,他們還是阻塞了對方。

死鎖:兩個或更多執行緒阻塞著等待其它處於死鎖狀態的執行緒所持有的鎖。死鎖通常發生在多個執行緒同時但以不同的順序請求同一組鎖的時候,死鎖會讓你的程式掛起無法完成任務。

在這裡插入圖片描述 如何避免死鎖?

死鎖的發生必須滿足以下四個條件:

互斥條件:一個資源每次只能被一個程序使用。

請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。

不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

兩種種用於避免死鎖的技術:

加鎖順序(執行緒按照一定的順序加鎖)

加鎖時限(執行緒嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖) 在這裡插入圖片描述