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