過年后從勝任工作的喜悅中緩過勁來薯蝎,發(fā)現(xiàn)自己在Java之路上只是剛剛?cè)腴T德绿,于是開始了惡補(bǔ)辕录。最先主要是看書補(bǔ)習(xí)基礎(chǔ)知識(shí)昵仅,后來一步步逐漸閱讀源碼缓熟。相對于讀書看視頻這些直觀的知識(shí)輸出,閱讀源碼的門檻稍微高了一點(diǎn)摔笤,我也浪費(fèi)了很多時(shí)間在閱讀源碼的門口徘徊够滑,始終不得法而入。在不斷地嘗試后終于也總結(jié)了一些經(jīng)驗(yàn)吕世,分享出來希望幫助有需要的人彰触。
閱讀源碼的好處
許多人的學(xué)習(xí)路線應(yīng)該與我一致,在學(xué)習(xí)完java的基礎(chǔ)知識(shí)之后命辖,迫不及待地扎進(jìn)源碼的海洋之中想要一睹大師們的風(fēng)采况毅。為什么我們要閱讀源碼呢?我認(rèn)為有以下兩點(diǎn)好處尔艇。1尔许、閱讀代碼可以幫助我們深入了解內(nèi)部的實(shí)現(xiàn),看到大牛們?nèi)绾畏庋b繼承多態(tài)终娃,如何合理地運(yùn)用設(shè)計(jì)模式味廊,如何在開銷最小的情況下保證線程安全等等。我們應(yīng)該感謝開源棠耕,大牛們的代碼就是一本本活生生的教科書余佛。另一方面,閱讀源碼可以幫我們解決很多工作中遇到的問題昧辽,許多bug都是因?yàn)槲覀儗Τ绦蚣?xì)節(jié)實(shí)現(xiàn)的不了解導(dǎo)致的衙熔。如果不知道線程池在核心線程滿了之后是先入隊(duì)還是繼續(xù)創(chuàng)建線程直到最大線程數(shù),可能就會(huì)造成性能上的問題搅荞;如果不了解IOC、AOP框咙,可能就無法解決AOP和自己實(shí)現(xiàn)BeanPostProcessor做的代理之間可能出現(xiàn)的沖突等等咕痛。
閱讀源碼的方式
我認(rèn)為源碼閱讀分為三步,這里以Netty的源碼舉例喇嘱。第一步茉贡,首先了解一下源碼如何使用≌咄可以試著先寫一個(gè)簡單的客戶端服務(wù)端的demo將Netty跑起來腔丧,了解一下基本的功能放椰,常用的API等等。這時(shí)可以輔助閱讀官方的文檔或者買一本快速入門的書籍愉粤。會(huì)用從來都是閱讀源碼的基礎(chǔ)砾医,如果用都沒用過上來就讀,一方面很難讀懂浪費(fèi)時(shí)間衣厘,另一方面有些為了讀源碼而讀源碼的舍本逐末如蚜。
第二步則是了解源碼的背景以及整體架構(gòu)。我們都知道Netty總體上是對NIO的一個(gè)封裝影暴,那么NIO是什么错邦?為什么要封裝它,解決了什么問題型宙?OIO是什么撬呢?NIO相對于OIO又改進(jìn)了什么?這一連串的問題都需要我們事先進(jìn)行了解妆兑,才會(huì)在閱讀源碼之旅中有所得魂拦。除此之外,我們應(yīng)該從官方的文檔或者網(wǎng)上的博客上大體了解Netty的架構(gòu)箭跳,整體組成是怎樣以及每個(gè)模塊負(fù)責(zé)什么功能晨另,這樣會(huì)使得我們在閱讀源碼之時(shí)不會(huì)一葉障目,陷入細(xì)節(jié)谱姓。
最后就可以開始閱讀源碼了借尿。閱讀源碼的好方法有很多,個(gè)人比較喜歡一邊看博客一邊跟著debug屉来,效率很高路翻。還有一點(diǎn)需要注意的是,我們?nèi)绻肓私釴etty茄靠,一方面要閱讀Netty的源碼了解細(xì)節(jié)實(shí)現(xiàn)茂契,另一方面要閱讀用Netty進(jìn)行工業(yè)級實(shí)現(xiàn)的代碼(Dubbo、RocketMQ等)了解Netty正確的打開方式慨绳。
說是閱讀源碼的心得掉冶,卻主要講的是閱讀源碼的鋪墊。個(gè)人認(rèn)為這些鋪墊一定程度上比閱讀源碼更重要脐雪。