「BATJ面試系列」并發(fā)編程

作為一個合格的Java程序員声登,必須要對并發(fā)編程有一個深層次的了解,在很多互聯(lián)網(wǎng)企業(yè)都會重點考察這一塊′桃颍可能很多工作3年以上的Java程序員對于這一領(lǐng)域幾乎沒有太多研究。所以在接下來內(nèi)容中伺绽,我會將并發(fā)編程整個領(lǐng)域由淺到深做非常全面的分析养泡。

內(nèi)容導(dǎo)航

  • 從操作系統(tǒng)的發(fā)展了解進程、線程模型
  • 線程的優(yōu)勢
  • 線程的生命周期
  • 線程的應(yīng)用場景

了解進程憔恳、線程模型

每次學(xué)習(xí)一個新技術(shù)瓤荔,我會先去了解這個技術(shù)的背景净蚤,這個過程看似浪費時間钥组,其實在后續(xù)的學(xué)習(xí)過程中,能夠促進理解很多問題今瀑。所以對于線程這個概念程梦,我會先從操作系統(tǒng)講起点把。因為操作系統(tǒng)的發(fā)展帶來了軟件層面的變革。 從多線程的發(fā)展來看屿附,可以操作系統(tǒng)的發(fā)展分為三個歷史階段:

  • 真空管和穿孔卡片
  • 晶體管和批處理系統(tǒng)
  • 集成電路和多道程序設(shè)計

最早的計算機只能解決簡單的數(shù)學(xué)運算問題郎逃,比如正弦、余弦等挺份。運行方式:程序員首先把程序?qū)懙郊埳习玻缓蟠┛壮煽ㄆ保侔芽ㄆ袔氲綄iT的輸入室匀泊。輸入室會有專門的操作員將卡片的程序輸入到計算機上优训。計算機運行完當(dāng)前的任務(wù)以后,把計算結(jié)果從打印機上進行輸出各聘,操作員再把打印出來的結(jié)果送入到輸出室揣非,程序員就可以從輸出室取到結(jié)果。然后躲因,操作員再繼續(xù)從已經(jīng)送入到輸入室的卡片盒中讀入另一個任務(wù)重復(fù)上述的步驟早敬。

  1. 操作員在機房里面來回調(diào)度資源,造成計算機存在大量的空閑狀態(tài) 大脉。而當(dāng)時的計算機是非常昂貴的搞监,人們?yōu)榱?/li>
  2. 減少這種資源的浪費。就采用了 批處理系統(tǒng)來解決

批處理操作系統(tǒng)的運行方式:在輸入室收集全部的作業(yè)镰矿,然后用一臺比較便宜的計算機把它們讀取到磁帶上腺逛。然后把磁帶輸入到計算機,計算機通過讀取磁帶的指令來進行運算衡怀,最后把結(jié)果輸出磁帶上棍矛。批處理操作系統(tǒng)的好處在于,計算機會一直處于運算狀態(tài)抛杨,合理的利用了計算機資源够委。(運行流程如下圖所示)

「BATJ面試系列」并發(fā)編程
  1. 批處理操作系統(tǒng)雖然能夠解決計算機的空閑問題,但是當(dāng)某一個作業(yè)因為等待磁盤或者其他I/O操作而暫停怖现,
  2. 那CPU就只能阻塞直到該I/O完成茁帽,對于CPU操作密集型的程序,I/O操作相對較少屈嗤,因此浪費的時間也很少潘拨。
  3. 但是對于I/O操作較多的場景來說,CPU的資源是屬于嚴重浪費的饶号。

多道程序設(shè)計的出現(xiàn)解決了這個問題铁追,就是把內(nèi)存分為幾個部分,每一個部分放不同的程序茫船。當(dāng)一個程序需要等待I/O操作完成時琅束。那么CPU可以切換執(zhí)行內(nèi)存中的另外一個程序扭屁。如果內(nèi)存中可以同時存放足夠多的程序,那CPU的利用率可以接近100%涩禀。 在這個時候料滥,引入了第一個概念- 進程, 進程的本質(zhì)是一個正在執(zhí)行的程序,程序運行時系統(tǒng)會創(chuàng)建一個進程艾船,并且給每個進程分配獨立的內(nèi)存地址空間保證每個進程地址不會相互干擾葵腹。同時,在CPU對進程做時間片的切換時屿岂,保證進程切換過程中仍然要從進程切換之前運行的位置出開始執(zhí)行礁蔗。所以進程通常還會包括程序計數(shù)器、堆棧指針雁社。

有了進程以后浴井,可以讓操作系統(tǒng)從宏觀層面實現(xiàn)多應(yīng)用并發(fā)。而并發(fā)的實現(xiàn)是通過CPU時間片不端切換執(zhí)行的霉撵。對于單核CPU來說磺浙,在任意一個時刻只會有一個進程在被CPU調(diào)度。

有了進程以后徒坡,為什么還會出現(xiàn)線程呢撕氧?

在一個應(yīng)用進程中,會存在多個同時執(zhí)行的任務(wù)喇完,如果其中一個任務(wù)被阻塞伦泥,將會引起不依賴該任務(wù)的任務(wù)也被阻塞。舉個具體的例子來說锦溪,我們平常用word文檔編輯內(nèi)容的時候不脯,都會有一個自動保存的功能,這個功能的作用是刻诊,當(dāng)計算機出現(xiàn)故障的情況下如果用戶未保存文檔防楷,則能夠恢復(fù)到上一次自動保存的點。假設(shè)word的自動保存因為磁盤問題導(dǎo)致寫入較慢则涯,勢必會影響到用戶的文檔編輯功能复局,直到磁盤寫入完成用戶才可編輯,這種體驗是很差的粟判。如果我們把一個進程中的多個任務(wù)通過線程的方式進行隔離亿昏,那么按照前面提到的進程演進的理論來說,在單核心CPU架構(gòu)中可以通過CPU的時間片切換實現(xiàn)線程的調(diào)度充分利用CPU資源以達到最大的性能档礁。

我們用了比較長的篇幅介紹了進程角钩、線程發(fā)展的歷史。總的來說是人們對于計算機的要求越來越高彤断;對于計算機本身的資源的利用率也在不斷提高野舶。

線程的優(yōu)勢

前面分析了線程的發(fā)展歷史易迹,這里簡單總結(jié)一下線程有的優(yōu)勢如下:

線程可以認為是輕量級的進程宰衙,所以線程的創(chuàng)建、銷毀要比進程更快

從性能上考慮睹欲,如果進程中存在大量的I/O處理供炼,通過多線程能夠加快應(yīng)用程序的執(zhí)行速度(通過CPU時間片的快速切換)。

由于線程是CPU的最小調(diào)度單元窘疮,所以在多CPU架構(gòu)中能夠?qū)崿F(xiàn)真正的并行執(zhí)行袋哼。每一個CPU可以調(diào)度一個線程

這里有兩個概念很多人沒有搞明白,就是并行和并發(fā):

并行:同時執(zhí)行多個任務(wù)闸衫,在多核心CPU架構(gòu)中涛贯,一個CPU核心運行一個線程,那么4核心CPU蔚出,可以同時執(zhí)行4個線程

并發(fā):同處理多個任務(wù)的能力,通常我們會通過TPS或者QPS來表示某某系統(tǒng)支持的并發(fā)數(shù)是多少弟翘。

總的來說,并行是并發(fā)的子集骄酗。也就是說我們可以寫一個擁有多線程并行的程序稀余,如果在沒有多核心CPU來執(zhí)行這些線程,那就不能以并行的方式來運行程序中的多個線程趋翻。所以并發(fā)程序可以是并行的睛琳,也可以不是。Erlang之父Joe Armstrong通過一張圖型的方式來解釋并發(fā)和并行的區(qū)別踏烙,圖片如下:

「BATJ面試系列」并發(fā)編程

線程的生命周期

線程是存在生命周期的师骗,從線程的創(chuàng)建到銷毀,可能會經(jīng)歷6種不同的狀態(tài)讨惩,但是在一個時刻線程只能處于其中一種狀態(tài)丧凤。

NEW:初始狀態(tài),線程被創(chuàng)建時候的狀態(tài)步脓,還沒有調(diào)用start方法

RUNNABLE:運行狀態(tài)愿待,運行狀態(tài)包含就緒和運行兩種狀態(tài),因為線程啟動以后靴患,并不是立即執(zhí)行仍侥,而是需要通過調(diào)度去分配CPU時間片

BLOCKED:阻塞狀態(tài),當(dāng)線程去訪問一個加鎖的方法時鸳君,如果已經(jīng)有其他線程獲得鎖农渊,那么當(dāng)前線程會處于阻塞狀態(tài)

WAITING:等待狀態(tài),設(shè)置線程進入等待狀態(tài)等待其他線程做一些特定的動作進行觸發(fā)

TIME_WAITING:超時等待狀態(tài)或颊,和WAITING狀態(tài)的區(qū)別在于超時以后自動返回

TERMINATED:終止?fàn)顟B(tài)砸紊,線程執(zhí)行完畢

下圖整理了線程的狀態(tài)變更過程及變更的操作传于,每一個具體的操作原理,我會在后續(xù)的文章中進行詳細分析醉顽。

「BATJ面試系列」并發(fā)編程

這里有一個問題大家可能搞不明白沼溜,BLOCKED和WAITING這兩個阻塞有什么區(qū)別?

  • BLOCKED狀態(tài)是指當(dāng)前線程在等待一個獲取鎖的操作時的狀態(tài)游添。
  • WAITING是通過Object.wait或者Thread.join系草、LockSupport.park等操作實現(xiàn)的
  • BLOCKED是被動的標(biāo)記,而WAITING是主動操作
  • 如果說得再深入一點唆涝,處于WAITING狀態(tài)的線程找都,被喚醒以后,需要進入同步隊列去競爭鎖操- 作廊酣,而在同步隊列中能耻,如果已經(jīng)有其他線程持有鎖,則線程會處于BLOCKED狀態(tài)亡驰。所以可以說- BLOCKED狀態(tài)是處于WAITING狀態(tài)的線程重新喚醒的必經(jīng)的狀態(tài)

線程的應(yīng)用場景

線程的出現(xiàn)晓猛,在多核心CPU架構(gòu)下實現(xiàn)了真正意義上的并行執(zhí)行。也就是說隐解,一個進程內(nèi)多個任務(wù)可以通過多線程并行執(zhí)行來提高程序運行的性能鞍帝。那線程的使用場景有哪些呢?

  • 執(zhí)行后臺任務(wù)煞茫,在很多場景中帕涌,可能會有一些定時的批量任務(wù),比如定時發(fā)送短信续徽、定時生成批量文件蚓曼。在這些場景中可以通過多線程的來執(zhí)行
  • 異步處理,比如在用戶注冊成功以后給用戶發(fā)送優(yōu)惠券或者短信钦扭,可以通過異步的方式來執(zhí)行纫版,一方面提升主程序的執(zhí)行性能;另一方面可以解耦核心功能客情,防止非核心功能對核心功能造成影響
  • 分布式處理其弊,比如fork/join,將一個任務(wù)拆分成多個子任務(wù)分別執(zhí)行
  • BIO模型中的線程任務(wù)分發(fā)膀斋,也是一種比較常見的使用場景梭伐,一個請求對應(yīng)一個線程。

合理的利用多線程仰担,可以提升程序的吞吐量糊识。同時,還可以通過增加CPU的核心數(shù)來提升程序的性能,這就體現(xiàn)了伸縮性的特點

關(guān)注我:私信回復(fù)“源碼”獲取往期Java高級架構(gòu)資料赂苗、源碼愉耙、筆記、視頻Dubbo拌滋、Redis朴沿、Netty、zookeeper鸠真、Spring cloud悯仙、分布式龄毡、高并發(fā)等架構(gòu)技術(shù)往期架構(gòu)視頻

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吠卷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沦零,更是在濱河造成了極大的恐慌祭隔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路操,死亡現(xiàn)場離奇詭異疾渴,居然都是意外死亡,警方通過查閱死者的電腦和手機屯仗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門搞坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魁袜,你說我怎么就攤上這事桩撮。” “怎么了峰弹?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵店量,是天一觀的道長。 經(jīng)常有香客問我鞠呈,道長融师,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任蚁吝,我火速辦了婚禮旱爆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘窘茁。我一直安慰自己怀伦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布庙曙。 她就那樣靜靜地躺著空镜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吴攒,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天张抄,我揣著相機與錄音,去河邊找鬼洼怔。 笑死署惯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镣隶。 我是一名探鬼主播极谊,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼安岂!你這毒婦竟也來了轻猖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤域那,失蹤者是張志新(化名)和其女友劉穎咙边,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體次员,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡败许,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑蔚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片市殷。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刹衫,靈堂內(nèi)的尸體忽然破棺而出醋寝,到底是詐尸還是另有隱情,我是刑警寧澤绪妹,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布甥桂,位于F島的核電站,受9級特大地震影響邮旷,放射性物質(zhì)發(fā)生泄漏蜂厅。R本人自食惡果不足惜傲霸,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一夹孔、第九天 我趴在偏房一處隱蔽的房頂上張望说搅。 院中可真熱鬧,春花似錦律歼、人聲如沸民镜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽制圈。三九已至们童,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲸鹦,已是汗流浹背慧库。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馋嗜,地道東北人齐板。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像葛菇,于是被迫代替她去往敵國和親甘磨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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