死鎖(deadlock)和活鎖(livelock)是併發應用程式經常發生的問題,也是多執行緒程式設計中的重要概念,
以下是對死鎖和活鎖的形象描述。
現有個過道,兩個人寬,兩側迎面走來兩個人a和b。
死鎖的情況:
a和b都不是講禮貌的人,都不願給別人讓路,所以a和b都在等對方讓路,導致誰也過不去。
活鎖的情況:
a和b都是很講禮貌的人,都主動給別人讓路。a往左移,同時b往右移;a往右移,同時b往左移。
a和b在移動的時候,同時擋住對方,導致誰也過不去。
同樣問題可以擴充套件到多個人和更寬的過道。
活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。 活鎖和死鎖的區別在於,處於活鎖的實體是在不斷的改變狀態,所謂的「活」, 而處於死鎖的實體表現為等待;活鎖有可能自行解開,死鎖則不能。
活鎖可以認為是一種特殊的飢餓。 下面這個例子在有的文章裡面認為是活鎖。實際上這只是一種飢餓。因為沒有體現出「活」的特點。 假設事務t2再不斷的重複嘗試獲取鎖r,那麼這個就是活鎖。
酷站網如果事務t1封鎖了資料r,事務t2又請求封鎖r,於是t2等待。t3也請求封鎖r,當t1釋放了r上的封鎖後,系統首先批准了t3的請求,t2仍然等待。然後t4又請求封鎖r,當t3釋放了r上的封鎖之後,系統又批准了t4的請求......t2可能永遠等待。
活鎖應該是一系列程序在輪詢地等待某個不可能為真的條件為真。活鎖的時候程序是不會blocked,這會導致耗盡cpu資源。
所謂死鎖: 是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
分布式系統中的死鎖處理
1死鎖發生的條件 當且僅當以下四個條件同時成立時,死鎖才會發生 1 互斥。同乙個資源在同一時刻最多只能被乙個程序占用。2 占有並等待。必然有乙個程序至少占用了系統中的乙個資源,同時在等待獲取被其他程序占用的資源。3 不可剝奪。乙個程序不能剝奪被其他程序占用的資源。4 迴圈等待。在等待圖中有乙個迴圈。...
分布式系統中的分布式事務
分布式事務中可以借助mq訊息系統來進行事務控制,這一點與可靠訊息最終一致方案一樣。看來mq中介軟體確實在乙個分布式系統架構中,扮演者重要的角色。最大努力通知方案是比較簡單的分布式事務方案,它本質上就是通過定期校對,實現資料一致性。中介軟體如何保證訊息的一致性 問題的問法多種多樣,怎麼保證兩個伺服器的...
基於ZooKeeper的分布式鎖和佇列
完全分布式鎖是全域性同步的,這意味著在任何時刻沒有兩個客戶端會同時認為它們都擁有相同的鎖,使用 zookeeper 可以實現分布式鎖,需要首先定義乙個鎖節點 lock root node 需要獲得鎖的客戶端按照以下步驟來獲取鎖 保證鎖節點 lock root node 這個父根節點的存在,這個節點是...