国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【全棧之路】JAVA基礎(chǔ)課程三_多線程和死鎖(20190614v1.0)

warnerwu / 2029人閱讀

摘要:一個(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ǔ):
最近習(xí)大大大力倡導(dǎo)“不忘初心、牢記使命”的主題教育,提出了“守初心、擔(dān)使命、找差距、抓落實(shí)”的總體要求,這正好也映射在了我們個(gè)人生活和工作中。人到中年,最多的是懶,缺乏了學(xué)生時(shí)代的初心,不管你處于哪個(gè)年紀(jì),請(qǐng)擺脫借口,端正態(tài)度,以家庭為寄托,以未來(lái)為展望,將技術(shù)提升和家庭教育落到實(shí)處,讓自己有生之年還能得到質(zhì)的飛躍。
并發(fā)和多線程

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

相關(guān)文章

  • 全棧之路JAVA基礎(chǔ)課程_線程死鎖20190614v1.0

    摘要:一個(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)...

    Allen 評(píng)論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_生產(chǎn)者消費(fèi)者問(wèn)題(20190614v1.1)

    摘要:寄語(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)行...

    lemon 評(píng)論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_生產(chǎn)者消費(fèi)者問(wèn)題(20190614v1.1)

    摘要:寄語(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)行...

    everfight 評(píng)論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_哲學(xué)家就餐問(wèn)題(20190614v1.2)

    摘要:歡迎進(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è)界...

    Mr_houzi 評(píng)論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_哲學(xué)家就餐問(wèn)題(20190614v1.2)

    摘要:歡迎進(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è)界...

    JerryZou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<