java多執行緒中的死鎖、活鎖、飢餓、無鎖都是什麼鬼?
轉載自 java多執行緒中的死鎖、活鎖、飢餓、無鎖都是什麼鬼?
死鎖、活鎖、飢餓是關於多執行緒是否活躍出現的執行阻塞障礙問題,如果執行緒出現了這三種情況,即執行緒不再活躍,不能再正常地執行下去了。
死鎖
死鎖是多執行緒中最差的一種情況,多個執行緒相互佔用對方的資源的鎖,而又相互等對方釋放鎖,此時若無外力干預,這些執行緒則一直處理阻塞的假死狀態,形成死鎖。
舉個例子,A同學搶了B同學的鋼筆,B同學搶了A同學的書,兩個人都相互佔用對方的東西,都在讓對方先還給自己自己再還,這樣一直爭執下去等待對方還而又得不到解決,老師知道此事後就讓他們相互還給對方,這樣在外力的干預下他們才解決,當然這只是個例子沒有老師他們也能很好解決,計算機不像人如果發現這種情況沒有外力干預還是會一直阻塞下去的。
活鎖
活鎖這個概念大家應該很少有人聽說或理解它的概念,而在多執行緒中這確實存在。活鎖恰恰與死鎖相反,死鎖是大家都拿不到資源都佔用著對方的資源,而活鎖是拿到資源卻又相互釋放不執行。當多執行緒中出現了相互謙讓,都主動將資源釋放給別的執行緒使用,這樣這個資源在多個執行緒之間跳動而又得不到執行,這就是活鎖。
飢餓
我們知道多執行緒執行中有執行緒優先順序這個東西,優先順序高的執行緒能夠插隊並優先執行,這樣如果優先順序高的執行緒一直搶佔優先順序低執行緒的資源,導致低優先順序執行緒無法得到執行,這就是飢餓。當然還有一種飢餓的情況,一個執行緒一直佔著一個資源不放而導致其他執行緒得不到執行,與死鎖不同的是飢餓在以後一段時間內還是能夠得到執行的,如那個佔用資源的執行緒結束了並釋放了資源。
無鎖
無鎖,即沒有對資源進行鎖定,即所有的執行緒都能訪問並修改同一個資源,但同時只有一個執行緒能修改成功。無鎖典型的特點就是一個修改操作在一個迴圈內進行,執行緒會不斷的嘗試修改共享資源,如果沒有衝突就修改成功並退出否則就會繼續下一次迴圈嘗試。所以,如果有多個執行緒修改同一個值必定會有一個執行緒能修改成功,而其他修改失敗的執行緒會不斷重試直到修改成功。之前的文章我介紹過JDK的CAS原理及應用即是無鎖的實現。
可以看出,無鎖是一種非常良好的設計,它不會出現執行緒出現的跳躍性問題,鎖使用不當肯定會出現系統效能問題,雖然無鎖無法全面代替有鎖,但無鎖在某些場合下是非常高效的。
相關文章
- Java多執行緒(五):死鎖Java執行緒
- java多執行緒(5)死鎖Java執行緒
- Java多執行緒7:死鎖Java執行緒
- Java多執行緒-無鎖Java執行緒
- 執行緒中的死鎖執行緒
- 併發程式設計之臨界區\阻塞\非阻塞\死鎖\飢餓\活鎖程式設計
- 多執行緒程式設計的鎖問題解析(鎖競爭死鎖活鎖及Date Race等)執行緒程式設計
- Java 實現執行緒死鎖Java執行緒
- Java多執行緒-死鎖的出現和解決Java執行緒
- Java多執行緒 -- 公平鎖和非公平鎖Java執行緒
- java中死鎖是什麼Java
- java多執行緒–同步鎖Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- Java執行緒面試題(02) Java執行緒中如何避免死鎖Java執行緒面試題
- java 執行緒鎖物件鎖的理解Java執行緒物件
- 多執行緒_鎖執行緒
- 多執行緒死鎖除錯小技巧執行緒除錯
- GCD&&執行緒死鎖GC執行緒
- GCD 之執行緒死鎖GC執行緒
- 23、Java併發性和多執行緒-重入鎖死Java執行緒
- Java中活鎖是什麼啊?Java
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒/併發10、不可重入鎖/自旋鎖、可重入鎖Java執行緒
- Java中常見死鎖與活鎖的例項Java
- Java 多執行緒之內建鎖與顯示鎖Java執行緒
- python多執行緒程式設計4: 死鎖和可重入鎖Python執行緒程式設計
- 多執行緒-死鎖問題概述和使用執行緒
- 多執行緒中的鎖系統(四)-談談自旋鎖執行緒
- 多執行緒安全性和Java中的鎖執行緒Java
- 如何處理執行緒死鎖執行緒
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- Java鎖——死鎖Java
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- JAVA多執行緒與鎖機制Java執行緒
- 什麼是死鎖?如何解決死鎖?
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- 為什麼dispatch_sync在主執行緒會死鎖執行緒