大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java知識點:JDK源碼、JVM原理、框架源碼

Java知識點:JDK源碼、JVM原理、框架源碼

更新時間:2019-08-29 14:03:49 來源:動力節點 瀏覽4031次

  從下面的圖片我們可以看出大致分為三個部分:JDK源碼、JVM原理、框架源碼。

image.png

  JDK源碼

  JDK源碼是一切的基礎,許多框架都參考了JDK源碼的實現思路,因此弄懂JDK源碼是一件非常重要的事情。而JDK源碼又可以分為下面4大塊:

  集合源碼

  并發集合源碼

  并發包源碼

  阻塞隊列源碼

  線程池源碼

  集合源碼

  說到集合,我們大家都非常熟悉,這可是我們工作中用得非常多的一類API。但會用了,還得知道它到底是如何實現的,這樣才可以避免踩坑。JDK源碼中的集合并不是特別多,大概有四大類大概14個常用的API。

  List集合

  ArrayList:列表集合經典實現。

  Vector:列表集合經典實現,線程安全,與ArrayList對應。

  LinkedList:鏈表結構的經典實現。

  Stack:棧結構的經典實現,先進后出的數據結構。繼承了Vector,線程安全。

  Set集合

  HashSet:Set集合的哈希實現。

  LinkedHashSet:Set集合的哈希實現,維護了元素插入順序。

  TreeSet:Set集合的有序實現。

  Queue集合

  PriorityQueue:優先級隊列

  LinkedList:雙向隊列實現

  ArrayDeque:雙向循環隊列實現

  Map集合

  HashMap:Map集合的經典哈希實現。

  LinkedHashMap:在HashMap的基礎上,增加了對插入元素的鏈表維護。

  WeakedHashMap:在HashMap的基礎上,使強引用變為弱引用。

  TreeMap:Map集合的有序實現。底層是紅黑樹的經典實現。

  在這14個常用的API中雖然有一些我們還沒使用過,但如果你要建立起一套完整的知識體系,那么還是有必要去仔細琢磨一下它們的作用,并且對它們進行橫向比較的。

  并發集合源碼

  我們前面說到的集合源碼,它們大部分都是線程不安全的,它們在多線程的環境下使用會產生各種各樣的問題。而線程安全與并發安全又不一樣,線程安全考慮的是絕對的安全,而并發安全則是犧牲部分特性來提高并發效率。也就是說并發集合適合在多線程環境下使用,并且效率足夠高,能夠應對高并發的情況。

  在JDK的并發集合源碼中,一共有7個常用的并發集合。

  ConcurrentHashMap:高并發的HashMap

  ConcurrentSkipListMap:高并發下的TreeMap(基于跳表實現)

  ConcurrentSkipListSet:內部使用ConcurrentSkipListMap實現

  CopyOnWriteArrayList:高并發的ArrayList,適合讀場景。

  CopyOnWriteArraySet:高并發的Set集合,使用CopyOnWriteArrayList實現。

  ConcurrentLinkedQueue:高并發的鏈表隊列。

  ConcurrentLinkedDeque:高并發的雙向鏈表隊列。

  雖然有7個并發集合,但是實際上只有5個左右,因為另外兩個都直接用代理的方式委托實現。例如:CopyOnWriteArraySet類內部并沒有具體的邏輯實現,而是直接委托CopyOnWriteArrayList實現。

  并發包源碼

  我們前面說過許多集合都是線程不安全的,在多線程環境、甚至高并發環境需要使用并發集合。那么并發集合到底是怎么實現線程安全的呢?在JDK1.8之后,并發集合大部分都使用CAS來實現線程安全。而其實在JDK1.8之前,許多線程安全都是使用鎖來實現的。而說到鎖,我們就必須了解一下并發包源碼。

  并發包源碼從零開始定義了一整套實現并發安全的機制,并且還提供了不少方便使用的并發工具。我們通過并發包就可以非常方便地實現多線程下的線程安全和并發控制,后面說到的阻塞隊列都是以這個為基礎的。

  并發包是一整套接口和實現的定義,其主要的類和實現如下:

image.png

  在并發源碼最頂層的是AbstractQueueSynchronizer接口,其定義了并發控制最為基礎的幾個接口,之后的Lock、ReentrantLock、ReentrantReadWriteLock都是在這基礎上實現的。而Condition接口則是繼AbstractQueueSynchronizer接口之后的另一個重要接口,其定義了分支條件,使得并發適用于更復雜的業務。

  定義好了AbstractQueueSynchronizer和Condition接口,并發包的基礎就搭建好了。并發包中提供了CountDownLatch、CyclicBarrier等并發工具類來實現常用的并發操作,這些工具類都是使用前面提到的Lock來實現的。

  阻塞隊列源碼

  阻塞隊列其實是屬于并發包的一部分,但因為其功能性特別明顯,所以我們專門挑出來單獨說。阻塞隊列用于在高并發環境下進行數據的交換,其實現基礎是我們前面說到的并發包,沒有并發包就沒有阻塞隊列。

  在JDK中,阻塞隊列一共可以分為三大類一共8個常用的阻塞隊列。

  基礎實現

  這塊是阻塞隊列最基礎的實現

  ArrayBlockingQueue:數組組成的有界阻塞隊列

  LinkedBlockingQueue:鏈表組成的無界阻塞隊列

  LinkedBlockingDeque:鏈表組成的雙向阻塞隊列

  有序延遲實現

  這塊的阻塞隊列還實現了元素的排序以及延遲功能,只有時間到了才能出隊列。

  PriorityBlockingQueue:支持優先級排序的無界阻塞隊列

  DelayQueue:支持優先級實現的無界延遲阻塞隊列

  DelayedWorkQueue:線程池中的延遲阻塞隊列

  數據交換實現

  這塊阻塞隊列主要用于多線程之間的數據交換

  SynchronousQueue:不存儲元素的數據交換阻塞隊列

  LinkedTransferQueue:鏈表組成的數據交換無界阻塞隊列

image.png

  線程池源碼

  線程池也是JDK源碼中非常重要的一塊,妥善利用線程池可以提高效率。而線程池的基礎其實就是我們前面講到的阻塞隊列,線程池的延遲功能都是使用阻塞隊列實現的。線程池的整體架構比較多,但是并不復雜,也沒有什么難點。如果弄懂了線程池的整體類結構,那么線程池也就沒什么太大的問題了。

image.png

  JVM原理

  JVM可以說是Java程序員必須要掌握的基礎知識了。初學者或許會搞不懂這些東西到底有什么用,一開始學習都是為了面試用。但老司機告訴你學習JVM原理有下面兩個非常重要的用處:

  理解Java語言特性。Java代碼寫出來的只是語言層面的東西,當我們要了解一個特性是如何實現的,我們就需要深入到字節碼層面。例如:boolean這個類型,在Java語言層面是存在的。但是其在字節碼層面是不存在的,其在字節碼層面是使用Integer的1和0表示true和false。

  學習排查線上問題。我們遇到線上JVM問題,經常提示說:OutOfMemoryError:Javaheapspace。這時候你會不知道從何入手,這是因為你不懂JVM的內存結構。所以你必須去學習JVM的內存結構,如何排查問題發生在哪塊內存,如何解決問題。而這一切的基礎就是JVM的基礎知識。

  關于JVM的基礎知識,我寫了一個系列的文章來介紹,有興趣的可以閱讀以下:JVM系列文章

  框架源碼

  學習完JDK的源碼,我們就需要把我們常用的框架源碼都弄清楚。這樣在遇到框架問題的時候,我們才可以快速地排查問題。

image.png

  上面的思維導圖從上到下都是逐次遞進的。我們學習了JDK源碼,再學習Web框架就可以實現簡單的Web項目。而隨著業務增長,我們需要加入RPC服務化框架將其服務化。而隨著業務復雜化和井噴,我們需要加入消息隊列和緩存來進一步提高業務的穩定性。

  Web框架

  Spring和MyBatis可以說是JavaWeb開發者必學的兩個框架了,因此對這兩個框架有必要做一個深入的了解。

  對于Spring來說,其整個源碼體系太過于復雜,所以我們還是得抓住重點。對于Spring來說,最重要的是其AOP和IoC的實現,以及其容器體系和常用的接口。而對于MyBatis來說,其體系相對沒有Spring那么復雜,所以可以稍微深入一些。

  RPC框架

  在所有RPC框架中,dubbo可以說是最通用的一個了。所以如果你所在的公司沒有自研的RPC框架,那么你不妨可以將dubbo作為你的學習框架。

  對于RPC框架來說,其實無非就是封裝對象代理,最后通過與服務提供者進行網絡通信。但是如何進行封裝,如果進行負載均衡的實現,這就考驗一個框架設計者的功力了。

  一致性框架

  對于分布式系統,非常重要的一個組件就是一致性框架。在這些框架中,最常見的兩個是Zookeeper和Eureka。Zookeeper實現了CAP中的CP(即注重強一致性),而Eureka則是實現了CAP中的AP(即注重可用性)。

  雖然平常我們都將Zookeeper和Eureka作為服務化的協調組件,基本上沒有什么機會深入學習。但是有機會還是可以深入了解一下的。

  消息隊列

  消息隊列可以說是實現業務解耦以及突發流量的利器。而在大型業務場景中,最常用的就是Kafka和RocketMQ了,因此弄懂這兩個消息隊列的原理基本上就足夠用了。

  對于消息隊列,建議先選擇一個深入研究,先弄懂其基本原理,之后再閱讀源碼驗證想法。因為RocketMQ是基于Kafka改進的,所以建議先從Kafka入手研究。Kafka研究得差不多了,RocketMQ的研究也會進展飛速。

  緩存框架

  緩存框架可以說是高并發下必用的一個框架了,但我們經常只是使用它,而不知道起內部的原理和構造。因此找個時間深入學習下原理,還是很有必要的。

  網絡框架

  對于一些網絡項目,例如聊天IM等,就需要用到Netty等框架。而Netty又是這類網絡框架的佼佼者,通過對其源碼的研究,可以學到不少知識。

  搜索框架

  對于一些搜索功能的項目,單純的數據庫SQL查詢已經無法滿足需求了,這時候ElasticSearch的學習和研究就提上議程了。有時間的話,研究學習一下還是很有必要的。

  增量訂閱框架

  Canal和Otter框架可以幫助你獲得數據庫的變化信息,從而更方便地做業務擴展。對于這類框架,屬于特定領域的細分框架,有時間可以研究一下。

  最后福利,免費贈送免費Java視頻教程,登錄動力節點官網【視頻課程】站內視頻可免費下載學習。

image.png

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 看真人视频一一级毛片 | 国产成人香蕉在线视频fuz | 免费国产一区二区三区四区 | 欧美一级视 | 国产美女流白浆的免费视 | 久久在线 | 国产三级在线精品男人的天堂 | 日韩精品一区二区在线观看 | 亚洲大片在线观看 | 99免费在线观看视频 | 久久九九精品视频 | 国产91在线|亚洲 | 92国产福利久久青青草原 | 欧美激情精品久久久久久久久久 | 欧美精品四虎在线观看 | 日日射天天操 | 香港aa三级久久三级老师 | 欧美专区在线观看 | 亚洲欧美日韩国产精品第不页 | 天天cao在线| 国产精品国产三级国产普通话 | 毛片你懂的| 夜夜爽天天狠狠九月婷婷 | 欧美成人久久久 | 亚洲免费视频网址 | 91福利精品老师国产自产在线 | 精品久久久久久久久免费影院 | 欧美爱爱爱爱免费视频 | 奇米影视777俺要去888 | 久热这里只精品99国产6_99 | 国产亚洲欧美久久久久 | 久久一本久综合久久爱 | 亚洲高清一区二区三区久久 | 精品天海翼一区二区 | 奇米影视在线视频 | 中文久久 | 国产草比 | 日韩大乳视频中文字幕 | 国产精品不卡视频 | 麻豆亚洲精品一区二区 | 亚洲国产天堂在线mv网站 |