【多線程】基礎(chǔ)理論知識(shí)

上一個(gè)系列是SpringCloud入門(mén)系列,以后肯定會(huì)寫(xiě)一期進(jìn)階系列浦徊,但是目前更新的是多線程系列馏予。

多線程的重要性不用多說(shuō),高并發(fā)在現(xiàn)在的生活無(wú)處不在盔性。618霞丧,雙11,12306冕香,支持的并發(fā)量那都不知道是多大蛹尝,說(shuō)再多遍也不嫌多后豫,是非常非常非常傾佩這些團(tuán)隊(duì)的。

本篇文章重點(diǎn)是帶大家了解下進(jìn)程和線程方面的基礎(chǔ)理論知識(shí)突那,涉及到的概念都是簡(jiǎn)單但是又很實(shí)用的挫酿,一些可能沒(méi)涉及到的概念也會(huì)在后面的文章中寫(xiě)出來(lái)。

進(jìn)程

進(jìn)程的簡(jiǎn)單概念

在進(jìn)程模型中愕难,計(jì)算機(jī)所有可運(yùn)行的軟件早龟,通常也包括操作系統(tǒng),被組織成若干順序進(jìn)程猫缭,簡(jiǎn)稱(chēng)進(jìn)程(process)葱弟,一個(gè)進(jìn)程就是一個(gè)正在執(zhí)行程序的示例。

大白話來(lái)說(shuō)猜丹,一個(gè)進(jìn)程就相當(dāng)于我們啟動(dòng)的項(xiàng)目芝加,或者說(shuō)打開(kāi)任務(wù)管理器的時(shí)候看到的這些應(yīng)用都是進(jìn)程。一個(gè)進(jìn)程主要包括程序計(jì)數(shù)器居触、寄存器和變量的當(dāng)前值妖混。

image

這里還需要講下的一個(gè)概念就是守護(hù)進(jìn)程

停留在后臺(tái)處理的進(jìn)程稱(chēng)之為守護(hù)進(jìn)程轮洋。

進(jìn)程的狀態(tài)

進(jìn)程的狀態(tài)有三個(gè)狀態(tài)制市,就緒、運(yùn)行弊予、阻塞祥楣。就緒就是能運(yùn)行,但是還沒(méi)運(yùn)行汉柒,CPU被其它進(jìn)程占用了误褪;運(yùn)行就是該時(shí)刻進(jìn)程已經(jīng)實(shí)際占用CPU在運(yùn)行了;阻塞基本上等于暫停了碾褂,除非有外界因素干擾兽间,不然該進(jìn)程就不能運(yùn)行了。

拿做核酸來(lái)講正塌,醫(yī)護(hù)人員就是CPU嘀略,正在做核酸的人就是運(yùn)行態(tài),在后面排隊(duì)的就是就緒態(tài)乓诽,沒(méi)有人逼他自己不想做根本沒(méi)有來(lái)排隊(duì)就是阻塞態(tài)帜羊。

image

值得注意的是,這三種狀態(tài)是可以互相轉(zhuǎn)換

image
  • 運(yùn)行 》》 阻塞: 當(dāng)系統(tǒng)發(fā)現(xiàn)進(jìn)程無(wú)法再運(yùn)行下去的時(shí)候鸠天,或者認(rèn)為終止進(jìn)程后就會(huì)發(fā)生該轉(zhuǎn)換讼育。
  • 運(yùn)行 《 》 就緒: 這兩個(gè)轉(zhuǎn)換大多數(shù)時(shí)候是一體的,主要是由系統(tǒng)進(jìn)程調(diào)度程序決定的,進(jìn)程對(duì)于調(diào)度的變化基本上是感知不到的奶段。當(dāng)系統(tǒng)認(rèn)為這個(gè)進(jìn)程已經(jīng)長(zhǎng)時(shí)間占用CPU了饥瓷,那么會(huì)根據(jù)一定的算法 重新分配CPU的時(shí)間片,此時(shí)就會(huì)伴隨著狀態(tài)的轉(zhuǎn)變忧饭。
  • 阻塞 》》就緒: 當(dāng)進(jìn)程等待的一個(gè)外部事件發(fā)生時(shí)就會(huì)發(fā)生次轉(zhuǎn)換扛伍,通俗就是,比如大規(guī)模核酸檢測(cè)词裤,社區(qū)上門(mén)提醒刺洒,就會(huì)去排隊(duì)。

進(jìn)程間的通信方式

進(jìn)程間的通信方式有8種吼砂,但是忘記在哪本書(shū)上看到的這8種的概念逆航,網(wǎng)上雖然有解釋?zhuān)遣惶珯?quán)威,就沒(méi)寫(xiě)出來(lái)渔肩,各位小伙伴暫時(shí)就先了解下是哪8種即可因俐。

無(wú)名管道,有名管道周偎,高級(jí)管道抹剩,消息隊(duì)列,信號(hào)量蓉坎,信號(hào)澳眷,共享內(nèi)存和套接字。

image

線程

線程基本概念

對(duì)于線程蛉艾,查了很久也沒(méi)有一個(gè)明確的概念钳踊,甚至再《現(xiàn)代操作系統(tǒng)中》也是模糊的概念,迷你進(jìn)程(稱(chēng)為線程)勿侯。

用Java程序通俗的來(lái)說(shuō)呢拓瞪,就是一個(gè)程序就是一個(gè)進(jìn)程,然后main方法就是該進(jìn)程的主線程助琐,然后在之后我們會(huì)創(chuàng)建多個(gè)線程祭埂。

我們知道,每個(gè)進(jìn)程都有一個(gè)地址空間和一個(gè)控制線程兵钮,這里的主線程是不是控制線程有待考量沟堡。

線程的狀態(tài)

相較于進(jìn)程而言,線程的狀態(tài)有五種矢空。

  • New: new是指新建了一個(gè)線程,但是還未啟動(dòng)禀横。對(duì)應(yīng)到代碼就是只是new了一個(gè)Thread后屁药,該線程就處于新建狀態(tài),此時(shí)僅由JVM為其分配內(nèi)存柏锄,并初始化其成員變量的值

  • Runnable: 當(dāng)線程調(diào)用了start()方法后酿箭,該線程就處于就緒狀態(tài)复亏,在等待cpu時(shí)間片。在虛擬機(jī)的表現(xiàn)就是Java虛擬機(jī)會(huì)為其創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器缭嫡,等待調(diào)度運(yùn)行

  • Running: 顧名思義就是程序處于運(yùn)行狀態(tài)缔御,對(duì)應(yīng)到代碼就是處于就緒狀態(tài)的線程獲得了CPU,開(kāi)始執(zhí)行run()方法的線程執(zhí)行體妇蛀,則該線程處于運(yùn)行狀態(tài)耕突。

  • Blocked: 就是我們經(jīng)常聽(tīng)到的阻塞狀態(tài),是指線程因?yàn)槟撤N原因放棄了cpu使用權(quán)评架,即讓出了cpu timeslice(時(shí)間片)眷茁,暫時(shí)停止運(yùn)行。這種狀態(tài)會(huì)一直維持到線程進(jìn)入可運(yùn)行(runnable)狀態(tài)纵诞,才有機(jī)會(huì)再次獲取到cpu時(shí)間片上祈,從而再次轉(zhuǎn)到運(yùn)行(running)狀態(tài)

  • Dead: 線程結(jié)束后的狀態(tài)就是死亡狀態(tài)

對(duì)于阻塞狀態(tài)而言,分為3種:

  • 等待阻塞: 運(yùn)行中的線程中的線程調(diào)用了object.wait()方法浙芙,JVM會(huì)把該線程放入等待隊(duì)列中登刺,使得本線程進(jìn)入阻塞狀態(tài)。

  • 同步阻塞: 運(yùn)行中線程在獲取對(duì)象的同步鎖時(shí)嗡呼,若該同步鎖被別的線程占用纸俭,大白話就是說(shuō)拿不到鎖,JVM會(huì)把該線程放入鎖池(lock pool)中晤锥。

  • 其它阻塞: 運(yùn)行中的線程執(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)蛉迹。

對(duì)于線程的Dead狀態(tài)而言,方式有以下三種:

  • 正常結(jié)束放妈,就是run()或者call()方法執(zhí)行完成
  • 異常結(jié)束北救,線程在運(yùn)行的過(guò)程中拋出一個(gè)未捕獲的Exception或Error
  • 調(diào)用stop()方法,直接調(diào)用該線程的stop()方法來(lái)結(jié)束線程芜抒,但是這種方法容易導(dǎo)致死鎖珍策,所以一般不建議使用
image

線程間的通信方式

線程間的通信方式主要是由3種方式,共享內(nèi)存宅倒、消息傳遞和管道流攘宙。

  • 共享內(nèi)存:java里面一般是使用volatile共享內(nèi)存
  • 消息傳遞:java里面會(huì)使用的方式如wait/notify , join 等方法。
  • 管道流:管道輸入/輸出流的形式

其它

進(jìn)程和線程的區(qū)別

多進(jìn)程就是操作系統(tǒng)中同時(shí)運(yùn)行的多個(gè)程序,多線程在同一個(gè)進(jìn)程中同時(shí)運(yùn)行的多個(gè)任務(wù)蹭劈。

根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位疗绣,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位

資源開(kāi)銷(xiāo):每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷(xiāo)铺韧;線程可以看做輕量級(jí)的進(jìn)程多矮,同一類(lèi)線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC)哈打,線程之間切換的開(kāi)銷(xiāo)小塔逃。

包含關(guān)系:如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的前酿,而是多條線(線程)共同完成的患雏;線程是進(jìn)程的一部分,所以線程也被稱(chēng)為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程罢维。

內(nèi)存分配:同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源淹仑,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的

影響關(guān)系:一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響肺孵,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉匀借。所以多進(jìn)程要比多線程健壯。

執(zhí)行過(guò)程:每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口平窘、順序執(zhí)行序列和程序出口吓肋。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中瑰艘,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制是鬼,兩者均可并發(fā)執(zhí)行

image

線程不安全

在《Java并發(fā)編程實(shí)戰(zhàn)》中有這么一句話

當(dāng)多個(gè)線程訪問(wèn)一個(gè)類(lèi)時(shí),如果不用考慮這些線程在運(yùn)行時(shí)環(huán)境下的調(diào)度和交替進(jìn)行紫新,并且不需要額外的同步及調(diào)用方代碼不必作其它的協(xié)調(diào)均蜜,這個(gè)類(lèi)的行為仍然是正確的,那么成這個(gè)類(lèi)是線程安全的芒率。

通俗一點(diǎn)來(lái)說(shuō)囤耳,要想代碼線程安全,其實(shí)就是保證狀態(tài)的訪問(wèn)時(shí)不出錯(cuò)的偶芍,對(duì)象的狀態(tài)一般情況下指的是數(shù)據(jù)充择。但是數(shù)據(jù)大多數(shù)情況都是共享可變的匪蟀。

顧名思義椎麦,共享指的是線程之間是可以訪問(wèn)到這個(gè)變量,可變是是指數(shù)據(jù)的值是可以被更改的材彪,不是寫(xiě)死的观挎。

資源

什么是資源撒桨,在《現(xiàn)代操作系統(tǒng)》中的定義是

我們把這里需要排他性使用的對(duì)象稱(chēng)為資源。資源可以是硬件設(shè)備(如藍(lán)光驅(qū)動(dòng)器)或者是一組信息(如數(shù)據(jù)庫(kù)中一個(gè)加鎖的記錄)......簡(jiǎn)單來(lái)說(shuō)键兜,資源就是隨著時(shí)間的推移,必須能獲得穗泵、使用以及釋放的任何東西普气。

對(duì)于這個(gè)資源,在java程序里面是鎖呢佃延,還是指的共享變量呢现诀,我個(gè)人覺(jué)得更像是鎖,不知道各位小伙伴怎么看履肃。

并行和并發(fā)

并發(fā)是指同一個(gè)時(shí)間段內(nèi)多個(gè)線程在執(zhí)行任務(wù)仔沿,一般是交替執(zhí)行;并行是指同一個(gè)時(shí)刻下多個(gè)線程同時(shí)工作尺棋。

在操作系統(tǒng)的層次來(lái)看,如果多個(gè)線程能同時(shí)被多個(gè)CPU執(zhí)行,這樣就是并行盒齿。并發(fā)是多個(gè)線程被一個(gè)CPU按照某一算法切換執(zhí)行芳肌。

創(chuàng)作不易,如果對(duì)你有幫助荆残,歡迎點(diǎn)贊奴艾,收藏和分享啦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末内斯,一起剝皮案震驚了整個(gè)濱河市蕴潦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俘闯,老刑警劉巖潭苞,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異备徐,居然都是意外死亡萄传,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蜜猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秀菱,“玉大人,你說(shuō)我怎么就攤上這事蹭睡⊙芰猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵肩豁,是天一觀的道長(zhǎng)脊串。 經(jīng)常有香客問(wèn)我辫呻,道長(zhǎng),這世上最難降的妖魔是什么琼锋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任放闺,我火速辦了婚禮,結(jié)果婚禮上缕坎,老公的妹妹穿的比我還像新娘怖侦。我一直安慰自己,他們只是感情好谜叹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布匾寝。 她就那樣靜靜地躺著,像睡著了一般荷腊。 火紅的嫁衣襯著肌膚如雪艳悔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天女仰,我揣著相機(jī)與錄音猜年,去河邊找鬼。 笑死董栽,一個(gè)胖子當(dāng)著我的面吹牛码倦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锭碳,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袁稽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了擒抛?” 一聲冷哼從身側(cè)響起推汽,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歧沪,沒(méi)想到半個(gè)月后歹撒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诊胞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年暖夭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撵孤。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迈着,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出邪码,到底是詐尸還是另有隱情裕菠,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布闭专,位于F島的核電站奴潘,受9級(jí)特大地震影響旧烧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜画髓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一掘剪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈虾,春花似錦杖小、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昂勉。三九已至浪册,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岗照,已是汗流浹背村象。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攒至,地道東北人厚者。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像迫吐,于是被迫代替她去往敵國(guó)和親库菲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容