1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【15期】談?wù)勥@幾個(gè)常見的多線程面試題

        共 1895字,需瀏覽 4分鐘

         ·

        2020-08-18 02:34

        程序員的成長之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
        關(guān)注


        閱讀本文大概需要 3 分鐘。

        以下幾道題目比較初級(jí),是必須要掌握的多線程基礎(chǔ)面試題。

        創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?

        有三種方式可以用來創(chuàng)建線程:
        • 繼承Thread類

        • 實(shí)現(xiàn)Runnable接口

        • 應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池

        實(shí)現(xiàn)Runnable接口這種方式更受歡迎,因?yàn)檫@不需要繼承Thread類。在應(yīng)用設(shè)計(jì)中已經(jīng)繼承了別的對(duì)象的情況下,這需要多繼承(而Java不支持多繼承),只能實(shí)現(xiàn)接口。同時(shí),線程池也是非常高效的,很容易實(shí)現(xiàn)和使用。

        概括的解釋下線程的幾種可用狀態(tài)。

        新建( new ):新創(chuàng)建了一個(gè)線程對(duì)象;
        可運(yùn)行( runnable ):線程對(duì)象創(chuàng)建后,其他線程(比如 main 線程)調(diào)用了該對(duì)象的 start ()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中,獲 取CPU的使用權(quán);
        運(yùn)行( running ):可運(yùn)行狀態(tài)( runnable )的線程獲得了CPU時(shí)間片( timeslice ) ,執(zhí)行程序代碼;
        阻塞( block ):阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了CPU 使用權(quán),也即讓出了 CPU timeslice ,暫時(shí)停止運(yùn)行。直到線程進(jìn)入可運(yùn)行( runnable )狀態(tài),才有 機(jī)會(huì)再次獲得 cpu timeslice 轉(zhuǎn)到運(yùn)行( running )狀態(tài)。
        阻塞的情況分三種:
        1. 等待阻塞:運(yùn)行( running )的線程執(zhí)行 o . wait ()方法, JVM 會(huì)把該線程放 入等待隊(duì)列( waitting queue )中。

        2. 同步阻塞:運(yùn)行( running )的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占用,則 JVM 會(huì)把該線程放入鎖池( lock pool )中。

        3. 其他阻塞: 運(yùn)行( running )的線程執(zhí)行 Thread . sleep ( long ms )或 t . join ()方法,或者發(fā)出了 I / O 請(qǐng)求時(shí), JVM 會(huì)把該線程置為阻塞狀態(tài)。當(dāng) sleep ()狀態(tài)超時(shí)、 join ()等待線程終止或者超時(shí)、或者 I / O 處理完畢時(shí),線程重新轉(zhuǎn)入可運(yùn)行( runnable )狀態(tài)。

        死亡( dead ):線程 run ()、 main () 方法執(zhí)行結(jié)束,或者因異常退出了 run ()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。

        同步方法和同步代碼塊的區(qū)別是什么?

        區(qū)別:
        • 同步方法默認(rèn)用this或者當(dāng)前類class對(duì)象作為鎖;

        • 同步代碼塊可以選擇以什么來加鎖,比同步方法要更細(xì)顆粒度,我們可以選擇只同步會(huì)發(fā)生同步問題的部分代碼而不是整個(gè)方法;

        在監(jiān)視器(Monitor)內(nèi)部,是如何做線程同步的?程序應(yīng)該做哪種級(jí)別的同步?

        監(jiān)視器和鎖在Java虛擬機(jī)中是一塊使用的。監(jiān)視器監(jiān)視一塊同步代碼塊,確保一次只有一個(gè)線程執(zhí)行同步代碼塊。每一個(gè)監(jiān)視器都和一個(gè)對(duì)象引用相關(guān)聯(lián)。線程在獲取鎖之前不允許執(zhí)行同步代碼。
        java 還提供了顯式監(jiān)視器( Lock )和隱式監(jiān)視器( synchronized )兩種鎖方案。

        什么是死鎖(deadlock)?

        兩個(gè)線程或兩個(gè)以上線程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖。結(jié)果就是這些線程都陷入了無限的等待中。

        如何確保N個(gè)線程可以訪問N個(gè)資源同時(shí)又不導(dǎo)致死鎖?

        多線程產(chǎn)生死鎖的四個(gè)必要條件:
        • 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。

        • 保持和請(qǐng)求條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得資源保持不放。

        • 不可剝奪性:進(jìn)程已獲得資源,在未使用完成前,不能被剝奪。

        • 循環(huán)等待條件(閉環(huán)):若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

        只要破壞其中任意一個(gè)條件,就可以避免死鎖
        一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。

        推薦閱讀:

        【14期】你能說說進(jìn)程與線程的區(qū)別嗎

        【13期】談?wù)?Redis 的過期策略

        【12期】談?wù)勴?xiàng)目中單點(diǎn)登錄的實(shí)現(xiàn)原理?

        5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。?!

        微信掃描二維碼,關(guān)注我的公眾號(hào)

        寫留言

        朕已閱?

        瀏覽 13
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日本一区二区三区在线观看 | 日韩一区二区三区电影在线观看 | 一级a做一级a做片性视频呀 | 欧美日韩国产免费观看成人片 | 国模私拍大尺度gogo | 2025亚洲天堂 | 一区日| 久久AV秘 一区二区三区水生 | 高清一区二区三区 | 久久精品女人毛片国产 |