邀請好友學(xué)習(xí)
每邀請一位你將得 ¥
Java并發(fā)編程學(xué)習(xí)寶典(漫畫版)
¥ 58.00
隨著 CPU 的發(fā)展從提高頻率轉(zhuǎn)變?yōu)樵黾觾?nèi)核,如何利用好 CPU 的多核優(yōu)勢,變得日益重要,程序開發(fā)中采用多線程來提高效率也變得更為普遍。但多線程是把雙刃劍,在提高計(jì)算效率的同時,也帶來了開發(fā)的復(fù)雜度,因此需要我們對多線程開發(fā)有足夠的認(rèn)知,才能確保多線程程序正確運(yùn)行。此外,多線程的知識也是面試中必考的知識點(diǎn),要想拿下理想的職位,對多線程的深入學(xué)習(xí)是必不可少的。
不知你對多線程開發(fā)是否有過這樣的困惑: 做了幾年 Java web 開發(fā),并沒有寫過多線程,但開發(fā)的軟件一樣高效、穩(wěn)定運(yùn)行,似乎多線程看起來并沒有那么重要?其實(shí)不然。在你的代碼背后,web 容器已經(jīng)幫你實(shí)現(xiàn)了多線程,所有的請求都是單獨(dú)的線程在并發(fā)處理。
多線程在軟件領(lǐng)域的應(yīng)用其實(shí)十分普遍,主要原因有如下幾點(diǎn):
避免 CPU 閑置
假如在一個業(yè)務(wù)操作中包含對另外兩個服務(wù)的調(diào)用,并且沒有依賴關(guān)系。如果采用單線程,就需要等待第一個服務(wù)返回結(jié)果后再發(fā)出第二個請求,但其實(shí)在第一個請求發(fā)出后,CPU 就已經(jīng)空閑了,大量時間花在了等待請求返回上。而如果采用多線程,同時發(fā)出兩個請求,總的等待時間將會大大縮短。
程序解耦
程序基本上都是由一個個方法的調(diào)用所組成。方法 A 返回結(jié)果傳遞給方法 B 繼續(xù)處理。也可以是方法 A 和方法 B 產(chǎn)生的結(jié)果一塊傳遞給方法 C 進(jìn)一步處理。這其實(shí)這就是生產(chǎn)者和消費(fèi)者。我們通過多線程,可以把邏輯以恰當(dāng)?shù)牧Χ冉玉?,一個線程負(fù)責(zé)生產(chǎn),另外一個線程負(fù)責(zé)消費(fèi)。兩個線程互不依賴,并且通過隊(duì)列起到了緩沖的作用。這就像我們?nèi)ワ埖瓿燥?,前臺負(fù)責(zé)收費(fèi)接單,后廚按訂單列表進(jìn)行加工,這是典型的多線程。絕對不會有一個飯館前臺收完錢后,自己再去后廚炒菜。
提升性能
一個人干活和一群人干活哪個更快?答案顯而易見,程序也是如此。一般來說,線程越多性能也越好。不過在達(dá)到峰值后,再增加線程也不能繼續(xù)提升性能。舉個例子,你的經(jīng)理讓你做工作量評估。你說:我一個人要干十天。經(jīng)理說:那兩個人,5 天能干完嗎?你想了想說:應(yīng)該差不多。經(jīng)理說:那我給你加 9 個人,1 天能搞定嗎?顯然這是不行的。
貼近現(xiàn)實(shí)世界
我們生活的世界其實(shí)就是一個多線程的世界,可以認(rèn)為每個人都是一個線程。而我們平時所做的絕大多數(shù)工作,都是多人完成的,也就是多線程完成。我們做軟件設(shè)計(jì)時,都會參考現(xiàn)實(shí)世界中的類似設(shè)計(jì)。所以多線程是必不可少的設(shè)計(jì)要素之一。Java 是面向?qū)ο蟮恼Z言,我們的代碼都已經(jīng)面向?qū)ο罅?,為什么我們編寫的對象還要以單線程的方式運(yùn)行呢?所以使用多線程就是這么自然而然的一件事情。更加貼近真實(shí)世界,意味著你的設(shè)計(jì)更加易于理解,并且不會有什么漏洞。
掌握了多線程開發(fā),在必要時運(yùn)用得當(dāng),將會讓你的程序在以上幾個層面有顯著的提升。因此,作為一名開發(fā)人員,多線程開發(fā)是必備技能。此外,我們使用的開源軟件,絕大多數(shù)都會用到多線程。學(xué)習(xí)多線程,對于我們理解開源軟件代碼將會帶來很大的幫助。
多線程開發(fā)在 Java 中屬于高階的開發(fā)技術(shù),如果能徹底掌握,并且靈活運(yùn)用。無論是對未來升職或找到理想的工作,都有非常重要的作用。如今的技術(shù)面試,多線程知識幾乎是必考的。因此,多線程這一關(guān)是要必過的。
講師李一鳴,2006 年畢業(yè)于北京航空航天大學(xué)后,一直從事 Java 領(lǐng)域的軟件開發(fā),有著豐富的開發(fā)經(jīng)驗(yàn)。曾經(jīng)就職于聯(lián)想集團(tuán),負(fù)責(zé)全球化系統(tǒng)的研發(fā)。后來在法律互聯(lián)網(wǎng)行業(yè)創(chuàng)業(yè),作為核心成員之一開發(fā)了多款法律互聯(lián)網(wǎng)應(yīng)用。目前作為高級研發(fā)顧問,就職于 Thoughtworks。在這里能夠把更多的時間投入到技術(shù)本身,而這是技術(shù)人員的立命之本。業(yè)余時間參與了 Apache Pulsar 的中文文檔翻譯工作。為了增加大家的學(xué)習(xí)趣味,李一鳴老師親手繪制了許多生動有趣的漫畫插圖,并采用現(xiàn)實(shí)中的案例進(jìn)行類比講解,幫助大家理解學(xué)習(xí)內(nèi)容,專欄閱讀更加輕松高效。
本專欄采用的結(jié)構(gòu)如下:
1、初入職場,有簡單的 Java 開發(fā)基礎(chǔ),想要從基礎(chǔ)開始學(xué)習(xí) Java 多線程開發(fā)。
2、有 3-5 年甚至更多開發(fā)經(jīng)驗(yàn),想要深入了解 Java 多線程開發(fā)。
3、學(xué)習(xí)過多線程,想要了解在實(shí)際項(xiàng)目中如何應(yīng)用。
4、準(zhǔn)備跳槽面試,想要全方位,較為深入的學(xué)習(xí)多線程。
下載慕課網(wǎng)APP
更好的體驗(yàn),讓閱讀隨處可得
如無法下載使用圖片另存為
下載海報(bào)
Edingbrugh
筆者很有見解。寫的不錯之前沒有認(rèn)真的讀讀,讀了好幾次了受益頗多。期待下一個專欄。加油
業(yè)精于勤荒于嬉行成于思?xì)в陔S2019
寫的不錯呀,果然是大佬
向遠(yuǎn)之航
我反而覺得這樣的安排挺好的,在深入線程池之前,自己的思路沒有被侵染,自己動手來實(shí)現(xiàn)一個線程池更能體會其中的精妙之處。當(dāng)然,這個雖簡單但卻設(shè)計(jì)精奧的線程池,著實(shí)花了不少時間來理解每一個類的功能,感覺類之間層層相關(guān),需要反復(fù)揣摩。