原文地址:http://www.jianshu.com/p/4a41ee88bd82
物有本末,事有終始,知所先后,則近道矣

面試經歷
關於Java面試,你應該准備這些知識點
關於Java面試,你應該准備這些知識點(續)
前段時間抽空整理了上面兩篇面試經歷,收到不少的關注,很多同學私信我平時都是如何get到這些知識的,是否有一些相關的書單,Java的源碼太多了,應該如何看,框架的代碼應該如何閱讀等等問題。
現在想想,似乎以前也這樣迷茫過,沒有明確的方向,做過后端,做過前端,就因為啃完了一整本《JavaScript高級程序設計》,在面試的時候信誓旦旦說只做前端,不寫后端代碼。直到后來,碰巧有機會讓我重新撿起Java,很感激有這次機會,也慢慢的明確了自己的方向。
我喜歡在拿到書的那一刻就寫下當天的日期,方便以后可以知道這本書是何時買的,不知不覺中已經買了很多Java相關的書,同時也收獲了很多。
書單
一直以來,這本書都被認為是面向Java程序員的經典教程和參考書,內容翔實、客觀准確,不拖泥帶水,與《Java編程思想》齊名。
推薦作為Java的入門書籍,記得這是當時入手的第一本書,愛護有加,畢竟貴啊。

感受設計演變過程中所蘊含的大智慧,體會樂與怒的程序人生中值得回味的一幕幕。
推薦作為設計模式的入門書籍,里面的實現的代碼都是基於Java的,通過很生動的方式講解了23中設計模式,但是設計模式的思想和精髓,還是需要在平時項目中慢慢領會以及運用。

深入剖析Tomcat4和Tomcat5中的每個組件,並揭示其內部工作原理,從最基本的HTTP請求開始,直至使用JMX技術管理Tomcat中的應用程序,逐一剖析Tomcat的基本功能模塊,並配以示例代碼,使讀者可以逐步實現自己的Web服務器。
當時也不知道為什么會買這本書,功力不足,啃了很多遍也沒有啃完,似乎已經找不到這本書了...

周志明老師的第一版書,JVM入門經典之作,圍繞內存管理、執行子系統、程序編譯與優化、高效並發等核心主題對JVM進行了全面而深入的分析,深刻揭示了JVM的工作原理。
這是入手的第一本關於JVM的書籍,當時看了前面幾章節,感覺自己在學習幾年的Java白學了...前前后后啃了很多遍,因為看完會忘記

- 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第2版)》
第二版,又入手了。

你是否正在尋找一本能夠更加深入地了解Java編程語言的書,以便編寫出更清晰、更正確、更健壯且更易於重用的代碼。不用找了!本書為我們帶來了共78條程序員必備的經驗法則,針對你每天都會遇到的編程問題提出了有效、實用的解決方案。
無腦推薦吧,因為看完之后真的挺好。

凝聚了軟件開發社區專家多年摸索而獲得的寶貴經驗,擁有不因時光流逝而磨滅的價值。今天,無論是重構本身,業界對重構的理解,還是開發工具對重構的支持力度,都與本書出版時不可同日而語,但書中所蘊涵的意味和精華,依然值得反復咀嚼,而且往往能夠常讀常新。
雖然不是每一條都適合自己,但總有指導意義的,選擇喜歡的方式,開始愉快的重構吧,因為重構可以讓你輕松應對各種需求變更。

從JDK源碼、JVM、CPU等多角度全面剖析和講解Java並發編程的框架、原理和核心技術,采用循序漸進的講解方式,從並發編程的底層實現機制入手,逐步介紹了在設計Java並發程序時各種重要的技術、設計模式與應用,同時輔以豐富的示例代碼,使得開發人員能夠更快地領悟Java並發編程的要領,圍繞着Java平台的基礎並發功能快速地構建大規模的並發應用程序。
說實在的,這本書當時看得我高潮迭起,原來了解並發的底層實現原理之后可以這么痛快,收獲良多。

深入淺出地介紹了Java線程和並發,從並發性和線程安全性的基本概念出發,介紹了如何使用類庫提供的基本並發構建塊,如何將小的線程安全類組合成更大的線程安全類,如何利用線程來提高並發應用程序的吞吐量,如何識別可並行執行的任務,如何提高單線程子系統的響應性,如何確保並發程序執行預期任務,如何提高並發代碼的性能和可伸縮性等內容,最后介紹了一些高級主題,如顯式鎖、原子變量、非阻塞算法以及如何開發自定義的同步工具類。
看完《Java並發編程的藝術》之后,立馬又入手了此書,真的是相見恨晚。

圍繞大型網站和支撐大型網站架構的 Java 中間件的實踐展開介紹,從分布式系統的知識切入,讓讀者對分布式系統有基本的了解;然后介紹大型網站隨着數據量、訪問量增長而發生的架構變遷;
對於沒有大型網站系統開發經驗的同學來說,這確實是個福利,可以稍微的了解大型網站架構變遷過程中的較為通用的問題和解法,並了解構建支撐大型網站的 Java 中間件的實踐經驗。

和《大型網站系統與Java中間件實踐》類似吧,我覺得。

市面上介紹Java的書有很多,但專注於Java性能的並不多,能游刃有余地展示Java性能優化難點的更是鳳毛麟角,本書即是其中之一。通過使用JVM和Java平台,以及Java語言和應用程序接口,本書詳盡講解了Java性能調優的相關知識,幫助讀者深入理解Java平台性能的各個方面,使程序如虎添翼。
說實在的,看這本書,前前后后翻了很多次也沒翻完,慢慢來吧,畢竟性能優化這條路也是很漫長的。

“蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇蟮之穴無可寄托者,用心躁也”。對於技術人員來說,如果長期忽略自身技術的根基而去一昧地追求高層框架技術,這無疑是舍本求末的做法。
我為什么會買這本書?前段時間手撕HotSpot的大部分源碼,包括虛擬機啟動,虛擬機參數解析,類加載,對象創建過程,YGC和FGC的實現,過程很痛苦,后來發現了此書,就入手看看和自己的理解是否有出入,以免一條道走到黑。

Ruby之父松本行弘推薦:上古傳承之魔法,徹底揭開垃圾回收的秘密!
此書很新,在我手撕了HotSpot的GC部分源碼之后,覺得可以入手看看大神是如何理解垃圾回收算法的。

適合於已具有一定java編程基本的讀者,以及希望能夠把強大的搜索功能添加到自己的應用程序中的開發人員
當時因為項目需要,才入手了此書。

歷史上偉大的計算機科學著作之一
融深邃思想、實戰技術與趣味軼事於一爐的奇書
帶你真正領略計算機科學之美
閱讀此書,難,難,難,只有在興趣來臨時翻兩頁....

源碼
源碼這種東西,看的快,忘的也快,最好的方法是學會整理,把資料整理成自己的知識。
好多人覺得JDK源碼太多,無從下手,經常半途而非,以我的經驗來說,最好的方法是當你在項目中用到了某個類,可以利用空閑時間去研究,當然這是在感興趣的前提下,比如簡單ArrayList
是如何實現的,StringBuilder
和StringBuffer
有什么區別,HashMap
的實現原理,帶着問題去分析,從簡單的類開始循序漸進,同時在分析過程中能夠用自己的語言整理出來,就像一開始我寫過關於ArrayList的文章《Java Collections Framework - ArrayList》,雖然內容很簡單,但也算是一種嘗試,至少可以寫出來了,不管效果如何,剩下的只剩堅持了,自己嘗試寫過之后,可以加深理解和記憶。
看源碼的時候,可以給自己定幾個目標,畢竟一口吃不成胖子,只能慢慢的啃,路是走出來的,通過debug一步一步的走下去。
1、數據結構相關的類,如String、ArrayList,LinkedList,HashMap和ConcurrentHashMap等等。
2、線程並發相關的類,如Synchronized、ReentrantLock、ReadWriteLock、AQS和線程池的實現等。
如果一個類的實現很復雜,比如ConcurrentHashMap,就可以試着拆分成幾個模塊進行分析
深入淺出ConcurrentHashMap(1.8)
談談ConcurrentHashMap1.7和1.8的不同實現
ConcurrentHashMap的紅黑樹實現分析
深入分析ConcurrentHashMap1.8的擴容實現
如果看到后面已經不滿足於JDK層面的實現原理了,可以嘗試着看看HotSpot的源碼,比如Synchronized關鍵字如何實現,String常量池如何實現,類對象如何創建,只要能想到的,都可以從源碼中找到答案,答案就在那里,就看你能不能找到。
深入分析String.intern和String常量的實現原理
深入分析synchronized的JVM實現
深入分析Object.wait/notify實現機制
如何查看HotSpot VM的運行時數據
深入分析Object.finalize方法的實現原理
框架
曾有人說,你干嘛那么糾結於底層的實現,工作上又用不到了,有這時間還不如多看看框架之類的,我只能呵呵以對,框架固然重要,但是框架是會更新,會變的,而底層原理可以長久不衰,當你了解了一些JDK的底層實現,在閱讀框架源碼時,可以更加的得心應手。
以自己為例,由於項目需要,加上對高性能和多並發比較感興趣,看過比較多的Netty源碼,記得剛開始研究Netty源碼,也是一籌莫展,后來從NIO入手,寫了 《深入淺出NIO Channel和Buffer》,都是一些概念性的東西,自己寫一遍是為了加深理解,后來不滿足JDK中的socket實現,就嘗試到處找資料,於是寫了 《深入淺出NIO Socket實現機制》,有了這些基礎之后,再嘗試Netty,寫了《Netty入門簡介》,后來基於Netty寫了個簡單的服務,通過debug的方式,把Netty服務的啟動、請求的accept、read和write調試了N遍,這N遍過程其實還是需要耐心的,於是才有了如下的文章:
Netty源碼分析之服務啟動
Netty源碼分析之NioEventLoop
Netty源碼分析之ChannelPipeline
Netty源碼分析之accept過程
深入淺出Netty read
深入淺出Netty write
深入淺出Netty內存管理 PoolChunk
深入淺出Netty內存管理 PoolSubpage
深入淺出Netty內存管理 PoolChunkList
深入淺出Netty內存管理 PoolArena
深入淺出MappedByteBuffer
對源碼熟悉了之后,可以嘗試挖掘在框架中使用了哪些設計模式,框架的設計結構又是如何的,每一次實踐都是一次進步,關鍵在於如何邁出第一步。

Java這條道,還有很長的路要走,共勉!