Java多線(xiàn)程是一部比較難學(xué)難懂的書(shū)籍,但是學(xué)會(huì)了對(duì)我們學(xué)計(jì)算機(jī)的來(lái)說(shuō)用處很大的,小編整理了一篇Java并發(fā)編程實(shí)踐:教你輕松學(xué)習(xí)Java多線(xiàn)程供大家欣賞!
最近一段時(shí)間,我對(duì)《Java并發(fā)編程實(shí)踐》這本經(jīng)典而又有些難懂的書(shū)籍,嘗試用了一些簡(jiǎn)單有趣、通俗易懂的方式進(jìn)行解讀,現(xiàn)整理成GitBook(文末有鏈接),方便大家閱讀。
為什么要解讀這本書(shū)
因?yàn)檫@是一本經(jīng)典卻又難懂的書(shū)。
這本書(shū)的經(jīng)典我想不必多講了,幾乎所有想學(xué)習(xí)Java并發(fā)的同學(xué),都會(huì)被推薦去看這本書(shū)(雖然他們中的大多數(shù)在看了不到三分之一之后就放棄了),作為一本書(shū)籍,最重要的是系統(tǒng)性和準(zhǔn)確性,這本書(shū)涵蓋了Java并發(fā)中幾乎所有基礎(chǔ)知識(shí)點(diǎn),并且大
多數(shù)章節(jié)都配有實(shí)際案例,是一本非常值得收藏的Java并發(fā)參考手冊(cè)。
那么為什么說(shuō)這本書(shū)難懂呢?
總的來(lái)說(shuō)有以下幾點(diǎn):
理論過(guò)多。舉個(gè)例子,書(shū)中第五章,在講Java并發(fā)的一些基礎(chǔ)構(gòu)建模塊時(shí)(ConcurrentHashMap、CopyOnWriteArrayList、Future這些),前面用了很多篇幅講這些類(lèi)的理論知識(shí),到章節(jié)最后才用一個(gè)實(shí)際案例將這些知識(shí)串起來(lái),而很多讀者在看前
面那些枯燥乏味的理論性講解時(shí),就已經(jīng)消耗了太多意志力,導(dǎo)致最后根本沒(méi)精力看最后的案例;
有點(diǎn)跳躍。書(shū)中對(duì)一些知識(shí)點(diǎn)的講解,并沒(méi)有完全講透,有些只是一筆帶過(guò),讀者看到難免就會(huì)心里好多個(gè)疑問(wèn),然后就試圖通過(guò)上下文去理解作者的意思,最后又消耗了大量意志力,導(dǎo)致最終的棄讀;
中文翻譯別扭。這是很多經(jīng)典技術(shù)書(shū)籍的通病了,本身這本書(shū)就很難懂,翻譯的別扭,就更難懂了。
針對(duì)上面這些問(wèn)題,我采用了以下方式進(jìn)行解讀:
用講故事的方式進(jìn)行講解。讓文章兼具知識(shí)性和娛樂(lè)性,讓讀者閱讀時(shí)不會(huì)感到枯燥;
先案例后理論。我把書(shū)中放在章節(jié)最后的案例,挪到了文章的開(kāi)頭,讓讀者先對(duì)知識(shí)有了大概的了解,同時(shí)引發(fā)讀者的好奇心,在看文章后面的偏理論解讀的時(shí)候,不會(huì)昏昏欲睡;
不局限于書(shū)籍本身。和大多數(shù)讀者一樣,我在看這本書(shū)的時(shí)候,也經(jīng)常會(huì)卡殼,然后翻尋上下文,依舊百思不得其解。這時(shí)候就需要用到搜索引擎了,所以你經(jīng)常會(huì)在我的文章末尾看到除了《Java并發(fā)編程實(shí)踐》以外的其他參考文獻(xiàn);
必要時(shí)看原著。上面說(shuō)了,有些段落的中文翻譯實(shí)在看著別扭,這時(shí)候就需要看回原著,看看作者自己是如何表述的。
解讀脈絡(luò)
我這次解讀的內(nèi)容,也許只包含了Java并發(fā)中20%的知識(shí),但這20%的知識(shí),已經(jīng)足以涵蓋平時(shí)80%的使用場(chǎng)景。下面簡(jiǎn)單梳理一下這份解讀的脈絡(luò)。
1、為什么要使用線(xiàn)程池
首先,你學(xué)習(xí)Java多線(xiàn)程,得知道為什么要使用多線(xiàn)程吧?干嘛不老老實(shí)實(shí)使用單線(xiàn)程呢?這部分比較簡(jiǎn)單,書(shū)里講的也很清楚,網(wǎng)上一搜資料也一大把,所以這部分不作解讀 ( ̄ ̄)~
2、如何寫(xiě)出線(xiàn)程不安全的代碼
好,現(xiàn)在你知道為什么要學(xué)Java多線(xiàn)程了。
那么當(dāng)我們談學(xué)習(xí)多線(xiàn)程時(shí),我們是在談學(xué)習(xí)什么呢?談如何創(chuàng)建線(xiàn)程嗎?不是,多線(xiàn)程里的大多數(shù)知識(shí),都是在講如何在多線(xiàn)程的環(huán)境下,保證代碼的線(xiàn)程安全性,所以,接下來(lái),你要了解,如何寫(xiě)出線(xiàn)程不安全的代碼,知道什么樣的代碼是線(xiàn)程不安
全的,你才會(huì)去想如何才能讓它線(xiàn)程安全。
3、兩個(gè)最基礎(chǔ)的關(guān)鍵字
現(xiàn)在你寫(xiě)出了線(xiàn)程不安全的代碼,是時(shí)候想想要怎樣把它們變成線(xiàn)程安全的了。
在Java中,實(shí)現(xiàn)線(xiàn)程安全,最最基礎(chǔ)的就是兩個(gè)關(guān)鍵字,volatile和synchronize。
volatile用的比較少,但是通過(guò)對(duì)它的學(xué)習(xí),你可以了解Java內(nèi)存模型,學(xué)會(huì)透過(guò)JVM去看線(xiàn)程問(wèn)題,這是一個(gè)思考范式的提升: Volatile趣談——我是怎么把貝克漢姆的進(jìn)球弄丟的
synchronize,無(wú)需多言,不管是我們自己寫(xiě)的代碼,還是JDK里的各個(gè)線(xiàn)程安全類(lèi),如ConcurrentHashMap,HashTable,大多都是利用synchronize來(lái)實(shí)現(xiàn)的線(xiàn)程安全:如何用一句話(huà)介紹synchronize的內(nèi)涵
4、學(xué)會(huì)委托
學(xué)會(huì)了volatile和synchronize,以后就可以靠著兩兄弟打遍天下無(wú)敵手了?
理論上可行,不過(guò)就像那句話(huà)說(shuō)的,拿著錘子的人,看誰(shuí)都是釘子。要想建一棟大樓,我們不能只有錘子,我們還需要起重機(jī)。Java就給了我們很多牛哄哄的起重機(jī),比如ConcurrentHashMap,想想看,每次你想讓你的Map線(xiàn)程安全,都要自己手動(dòng)加上
synchronize,這多麻煩,有了ConcurrentHashMap,我們只要把線(xiàn)程安全的重任,委托給它去實(shí)現(xiàn)就ok了。
Java中可以被委托的類(lèi)還有很多,大體上分為三類(lèi),同步容器、并發(fā)容器和同步工具類(lèi),我的解讀,也是通過(guò)一個(gè)簡(jiǎn)單的緩存案例,展示了如何把一個(gè)原本線(xiàn)程不安全的代碼,通過(guò)synchronize改為線(xiàn)程安全,再通過(guò)委托,強(qiáng)化為性能更猛的緩存器:
Java趣談——如何構(gòu)建一個(gè)高效且可伸縮的緩存
5、學(xué)點(diǎn)內(nèi)功——線(xiàn)程池
現(xiàn)在你已經(jīng)掌握了極強(qiáng)的外功了,十八般武藝樣樣精通,可以去武林大會(huì)挑戰(zhàn)武林盟主了嗎?還不行,光有極強(qiáng)的外功,卻沒(méi)有與之匹配的內(nèi)功,只會(huì)讓你走火入魔。
Java多線(xiàn)程也是如此,上面講的都是外功,教你如何使用各種工具實(shí)現(xiàn)線(xiàn)程安全,但是想想看,實(shí)際項(xiàng)目中,你真的可以每個(gè)任務(wù)過(guò)來(lái)都給它創(chuàng)建一條線(xiàn)程嗎?肯定不行嘛,內(nèi)存會(huì)撐爆的!所以,你還需要掌握一項(xiàng)管控線(xiàn)程數(shù)量的技術(shù)——線(xiàn)程池,我將
通過(guò)一個(gè)Web服務(wù)器的案例,給你展示為什么要使用線(xiàn)程池以及如何將無(wú)線(xiàn)程數(shù)量管控的代碼改為由線(xiàn)程池管控的代碼:Java趣談——如何像Tomcat一樣處理請(qǐng)求
另外,我還將從Java并發(fā)大師Doug Lea的視角,帶你了解Java線(xiàn)程池背后的原理:Java線(xiàn)程池是如何誕生的?
6、學(xué)點(diǎn)設(shè)計(jì)——并發(fā)方案
學(xué)會(huì)了外功,又掌握了內(nèi)功,可以上江湖闖蕩了嗎?等等,還有一點(diǎn),你要知道什么才是你應(yīng)該出手的時(shí)機(jī),你總不能一上來(lái)就放大招殺敵一千自損四百吧。Java并發(fā)也是如此,你要知道,在什么情況下,應(yīng)該對(duì)任務(wù)進(jìn)行并行化處理,以及哪種情況下并
行處理效果更好,我用了一個(gè)頁(yè)面渲染器的案例,給你展示了,如何對(duì)并發(fā)方案進(jìn)行設(shè)計(jì)和優(yōu)化:Java趣談——如何寫(xiě)出一個(gè)高效的頁(yè)面渲染器
以上就是我對(duì)《Java并發(fā)編程實(shí)踐》中,足以解決你80%的并發(fā)問(wèn)題的20%知識(shí)的解讀,其他沒(méi)有解讀的包括:
如何取消和關(guān)閉線(xiàn)程
如何避免線(xiàn)程的活躍性風(fēng)險(xiǎn)
如何提升性能和可伸縮性
如何測(cè)試并發(fā)程序
顯示鎖及其原理
如何自定義同步工具
原子變量及其原理
非阻塞算法及其原理
難道這些知識(shí)不重要嗎?并不是,只是我還沒(méi)細(xì)看解讀不了罷了 (〃''〃)
那不掌握這些知識(shí),可以出山了嗎?可以,只要你把《Java并發(fā)編程實(shí)踐》這本書(shū)放在桌子旁邊,知道有問(wèn)題要去看哪部分就可以了,比如你寫(xiě)了一個(gè)并發(fā)程序,想測(cè)試一下,卻不知道從何入手,翻開(kāi)書(shū),看索引,第12章,并發(fā)程序的測(cè)試,看,學(xué),學(xué)
以致用,就ok了。
當(dāng)然,我的解讀只是為了幫助大家更好的理解書(shū)中的將的知識(shí),所以對(duì)于我解讀過(guò)的章節(jié),大家如果想深入學(xué)習(xí),還是要翻開(kāi)書(shū),研究一番的,只不過(guò)在看了我的解讀之后,你理解起來(lái)會(huì)更輕松,學(xué)習(xí)起來(lái)會(huì)更有目的性,效率會(huì)更高。
來(lái)源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問(wèn)題,請(qǐng)聯(lián)系我們及時(shí)刪除。