摘要:一個進程可以有多個線程。線程又叫做輕量級進程。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。不剝奪條件進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放只能是主動釋放。
歡迎進入JAVA基礎課程
博客地址:https://blog.csdn.net/houjiyu...
本系列文章將主要針對JAVA一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸JAVA開發菜鳥還是業界資深人士,都希望對廣大同行帶來一些幫助。若有問題請及時留言或加QQ:243042162。
寄語:并發和多線程
最近習大大大力倡導“不忘初心、牢記使命”的主題教育,提出了“守初心、擔使命、找差距、抓落實”的總體要求,這正好也映射在了我們個人生活和工作中。人到中年,最多的是懶,缺乏了學生時代的初心,不管你處于哪個年紀,請擺脫借口,端正態度,以家庭為寄托,以未來為展望,將技術提升和家庭教育落到實處,讓自己有生之年還能得到質的飛躍。
1. 進程和線程
進程:具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程:進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
區別:進程是執行著的應用程序,而線程是進程內部的一個執行序列。一個進程可以有多個線程。線程又叫做輕量級進程。
a.創建線程的幾種方式死鎖
(1)繼承 Thread
(2)實現 Runnable 接口
(3)應用程序可以使用 Executor 框架來創建線程池
b.線程的幾種狀態(早上打車去上班)
(1)新建(準備叫一輛嘀嘀打車)
(2)可運行(找到一輛可以帶你去上班的車)
(3)運行(司機接到你,帶你去上班)
(4)阻塞(路上堵車了):等待阻塞-wait、同步阻塞-同步鎖、其他阻塞-
Thread.sleep(long ms)或 t.join ()方法
(5)死亡(到公司了,付錢下車)
c.同步方法和同步代碼塊
同步方法默認用 this 或者當前類 class 對象作為鎖;
同步代碼塊可以選擇以什么來加鎖,比同步方法要更細顆粒度,我們可以選擇只同步會發生同步問題的部分代碼而不是整個方法。
概念:兩個線程或兩個以上線程都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是這些線程都陷入了無限的等待中。
舉例:某計算機系統中只有一臺打印機和一臺輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所占用,而P2在未釋放打印機之前,又提出請求使用正被P1占用著的輸入設備。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。
產生死鎖原因:
1. 系統資源的競爭
2. 進程推進順序非法
3. 死鎖產生的必要條件
產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。
(1)互斥條件:進程要求對所分配的資源(如打印機)進行排他性控制,即在一段時間內某資源僅為一個進程所占有。此時若有其他進程請求該資源,則請求進程只能等待。
(2)不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放(只能是主動釋放)。
(3)請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
(4)循環等待條件:存在一種進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被鏈中下一個進程所請求。即存在一個處于等待狀態的進程集合{Pl, P2, ..., pn},其中Pi等 待的資源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的資源被P0占有。
代碼塊
/** * 死鎖實例 * t1先運行,這個時候flag==true,先鎖定obj1,然后睡眠1秒鐘 * 而t1在睡眠的時候,另一個線程t2啟動,flag==false,先鎖定obj2,然后也睡眠1秒鐘 * t1睡眠結束后需要鎖定obj2才能繼續執行,而此時obj2已被t2鎖定 * t2睡眠結束后需要鎖定obj1才能繼續執行,而此時obj1已被t1鎖定 * t1、t2相互等待,都需要得到對方鎖定的資源才能繼續執行,從而死鎖。 */ class DeadLock implements Runnable{ private static Object obj1 = new Object(); private static Object obj2 = new Object(); private boolean flag; public DeadLock(boolean flag){ this.flag = flag; } @Override public void run(){ System.out.println(Thread.currentThread().getName() + "運行"); if(flag){ synchronized(obj1){ System.out.println(Thread.currentThread().getName() + "已經鎖住obj1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(obj2){ // 執行不到這里 System.out.println("1秒鐘后,"+Thread.currentThread().getName() + "鎖住obj2"); } } }else{ synchronized(obj2){ System.out.println(Thread.currentThread().getName() + "已經鎖住obj2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(obj1){ // 執行不到這里 System.out.println("1秒鐘后,"+Thread.currentThread().getName() + "鎖住obj1"); } } } } } public class LockDemo { public static void main(String[] args) { Thread t1 = new Thread(new DeadLock(true), "線程1"); Thread t2 = new Thread(new DeadLock(false), "線程2"); t1.start(); t2.start(); } }
運行結果
線程2運行 線程1運行 線程1已經鎖住obj1 線程2已經鎖住obj2
避免死鎖
加鎖順序(線程按照一定的順序加鎖)
加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,并釋放自己占有的鎖)
死鎖檢測
將
Thread t2 = new Thread(new DeadLock(false), "線程2");
改成
Thread t2 = new Thread(new DeadLock(true), "線程2");
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77768.html
摘要:一個進程可以有多個線程。線程又叫做輕量級進程。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。不剝奪條件進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放只能是主動釋放。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進...
摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執著追求科學夢想的精神,將激勵一代又一代科技工作者繼續奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎知識點進行...
摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執著追求科學夢想的精神,將激勵一代又一代科技工作者繼續奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎知識點進行...
摘要:歡迎進入基礎課程博客地址本系列文章將主要針對一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸開發菜鳥還是業界資深人士,都希望對廣大同行帶來一些幫助。若有問題請及時留言或加。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸JAVA開發菜鳥還是業界...
摘要:歡迎進入基礎課程博客地址本系列文章將主要針對一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸開發菜鳥還是業界資深人士,都希望對廣大同行帶來一些幫助。若有問題請及時留言或加。 歡迎進入JAVA基礎課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎知識點進行講解,為平時歸納所總結,不管是剛接觸JAVA開發菜鳥還是業界...
閱讀 3505·2021-11-23 10:13
閱讀 873·2021-09-22 16:01
閱讀 918·2021-09-09 09:33
閱讀 643·2021-08-05 09:58
閱讀 1725·2019-08-30 11:14
閱讀 1961·2019-08-30 11:02
閱讀 3274·2019-08-29 16:28
閱讀 1491·2019-08-29 16:09