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