<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          聊聊Java的多線程

          共 2522字,需瀏覽 6分鐘

           ·

          2021-12-18 17:29

          大家好,我是慶哥,今天來和大家聊聊Java多線程!

          多線程這個東西非常的重要,屬于Java的核心知識,也是面試必備的,其中的JUC更是一個初級程序員邁向中高級程序員的必經(jīng)之路,那你有沒有想過為什么多線程的地位如此之重,是什么原因?qū)е铝硕嗑€程變得越來越重要了呢?
          那就要聊聊摩爾定律了,什么是摩爾定律,這個不是咱們化學上的那個概念,這里的摩爾定律是由英特爾創(chuàng)始人之一Gordon Moore(戈登·摩爾)提出來的。
          其內(nèi)容為:
          當價格不變時,集成電路上可容納的元器件的數(shù)目約每隔18-24個月便會增加一倍,性能也將提升一倍。

          換言之,同樣的錢所能買到的電腦性能,將每隔18-24個月翻一倍以上。這一定律揭示了信息技術(shù)進步的速度。但是你應該知道,這個現(xiàn)象不可能一只保持下去的……

          所以從2003年開始CPU主頻已經(jīng)不再翻倍,而是采用多核而不是更快的主頻。也就是說摩爾定律失效了!
          什么是CPU主頻,簡單理解就是主頻越大,CPU性能也就越強,根據(jù)摩爾定律來說,可以通過增加晶體管數(shù)量提升主頻,從而提升CPU性能,但是當增加到一定數(shù)量就不能繼續(xù)通過增加的方式去提升性能了,可能繼續(xù)增加則會產(chǎn)生相反的作用,也就是摩爾定律失效了

          這里有一個理解的關鍵點就是,我們說的這個摩爾定律其實就是從硬件上去提升性能,但是在硬件上的提升可能剛開始的效果非常顯著,但是越到最后就會發(fā)現(xiàn),單靠提升硬件似乎到了瓶頸,依靠硬件提升的性能微乎其微,所以就得想其他辦法提升性能了!

          那現(xiàn)在問題就來了,在主頻不再提高且核數(shù)在不斷增加的情況下,要想讓程序更快就要用到并行或并發(fā)編程
          也就是說,多線程之所以變得越來越重要,是跟技術(shù)的發(fā)展離不開的,是時代所趨,單靠硬件上的提升,效果變得越來越不明顯了,所以就需要多線程來彌補這一差距,以前是一個人干活,現(xiàn)在10個人來干活,那肯定效率更高,所以多線程自然地位陡升!

          另外在軟件方面這塊,就是在現(xiàn)有的高并發(fā)系統(tǒng)中,常常需要一些異步+回調(diào)的操作,這樣的需求就需要多線程來完成,這也是導致多線程變得越來越重要的一個原因!
          多線程可以說是你必備的一個高級知識,掌握好以后,可以讓你碾壓60%以上的Java程序員,而且對你的面試極有幫助!

          理解進程和線程

          學習多線程,理解進程和線程是第一步~

          一個進程中包含多個線程,一個進程就相當于一個應用程序(就咱們平常安裝的一些軟件,比如qq,誒微信等等),一個應用程序底層就是 cpu 來運行的,比如我們的電腦同時打開了多個應用,表面看來像是在同時運行,實際上在同一時間只運行了一個應用程序,只不過 cpu 的運行速度非常快,會進行高速切換,讓我們覺得是在同時進行。
          最經(jīng)典的一個例子就是迅雷了,我們電腦打開迅雷相當于開了一個進程,當我們使用迅雷下載東西的時候,比如說,下載兩部電影,那么在迅雷中就存在兩個不同的執(zhí)行路徑,也就是有兩個線程在同時做下載這么個動作,也就是同時在執(zhí)行兩個任務!
          所以,進程包含線程,相當于一個進程下所有線程的集合一個線程就是一個執(zhí)行路徑。
          比如我們常寫的Java代碼中的main方法所在的線程就是一個主線程,我們創(chuàng)建的線程叫做子線程如果說一個項目中肯定有一個線程,那么這個線程就是主線程了。
          對于這個問題,到底該怎么理解或者說區(qū)分線程和進程的概念,再舉一個非常貼切的例子,我們大多數(shù)人都用過QQ吧,我們打開一個QQ,其實就是開啟了一個進程, 然后我們發(fā)送一段文字,那就是開啟了一個線程,我們再發(fā)送一天語音,那就是又開啟了一個線程,那么在這個QQ的進程中就有發(fā)文字和語言兩個線程了,當然,可能還有其他的線程!

          用戶線程和守護線程


          先看一段代碼:
          上述代碼一旦執(zhí)行一定會存在兩個線程:
          1. main主線程(用戶線程

          1. 后臺gc線程(守護線程

          什么是用戶線程呢?我們的main線程就是用戶線程,這個是系統(tǒng)的工作線程,它會執(zhí)行你線程當中設置的業(yè)務邏輯!

          什么是守護線程呢?對于我們熟知的gc(垃圾回收)線程就是一個守護線程,它跟用戶線程有個最主要的區(qū)別就是守護線程是不能單獨存在的,是在后臺默默執(zhí)行的,隨著一個用戶線程而生,當所依附的用戶線程掛掉之后,這個守護線程也就不存在了。
          對于線程可以通過以下設置是用戶線程還是守護線程:

          再強調(diào)一點,守護線程不能單獨存在,如果所有的用戶線程都執(zhí)行完畢了,那么不管是否還有守護線程在執(zhí)行任務,jvm都會退出,程序則會停止!
          另外還有一個知識點需要注意,就是這里:
          這里的順序是不能亂的,也就是設置守護線程要在start之前!

          什么是管程


          這里大家需要了解下什么是管程?可能大家對這個概念不是很熟悉,都聽說過什么線程啊,進程的,但是管程是什么東西?
          管程其實就是Monitor,這是啥玩意,翻譯過來其實就是監(jiān)視器的意思,說白了,這玩意就是我們平常所說的多線程加鎖,知道了吧!
          再說的官方點,這個Monitor是一種同步機制,什么意思嘞?

          就是它可以保證在同一個時間內(nèi)只能有一個線程去訪問被保護的數(shù)據(jù)和代碼,你看這不就是鎖嗎?我們加鎖的目的不也就是為了保證數(shù)據(jù)安全,通常情況下不也就是保證只有一個線程可以去操作業(yè)務邏輯嘛,對吧,所以這個叫做Monitor的監(jiān)視器就是鎖
          我們再深入點分析,在我們的java虛擬機中,它的同步就是基于這個Monitor管程對象實現(xiàn)的,我們的java對象其實都會伴生一個Monitor對象,又因為同步機制就是由這個Monitor實現(xiàn)的,所以在我們的Java中,每一個java對象的創(chuàng)建和銷毀都會伴隨著一個Monitor對象的創(chuàng)建和銷毀,因此,我們的每一個Java對象天生就是一把鎖!
          而這個Monitor的底層是由C++來實現(xiàn)的,我們不需要關注這個Monitor,而是注重于我們的Java對象,看個代碼:
          這段代碼中,我們就把Object對象作為一把鎖使用,記住,任何一個Java對象都可以作為一把鎖使用!
          瀏覽 42
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色福利网站 | 亚洲Av无码成人专区擼 | 狠狠久久| 亚洲成人一区二区 | 欧美精品成人一区二区三区四区 |