高級JAVA知識圖及JUC講解(看懂學半年進大廠無壓力)

  • 知識框架梳理
  • 核心知識框架圖

   

    以前待過一個公司,然後公司領導特別nice,10幾年的大廠經驗,然後技術也特別紮實全面,我們從他那邊學到很多東西,

但是他教給我們有價值的乾貨,還得屬於2017年年終review時候的分享的學習方法,我們知道授人予魚不如授人予漁,無可

置疑,get到學習的method比get到屬性有價值得多。

  其實,他教我們學習java的辦法很簡單,總結來說就是兩句話,一句是,維護一個屬於自己的知識框架圖,第二句

隔三差五去看看你所記的東西。看到這裏,你肯定覺得這種方法很小兒科,這種low B方法你早就get到了,或者說

你高中初中就一直在用了,但是我們要知道,正是這種返璞歸真的方式,纔是最好用的辦法~爲什麼這麼說呢,下

面我們來看一下艾賓浩斯記憶曲線吧~通過下面的遺忘曲線我們看到的知識點在沒有複習的情況下,15天后從百分

之100下降到了百分之五不到,基於艾賓浩斯記憶曲線,我們會發現了複習知識點的價值所在。舉個例子,

當你要面試別人或者要參加面試的時候,你會花很多很多時間來複習你平常積累的知識點,特別是參加面試的

準備時間,這個時間少則兩三個月,多則半年,視人而定,但是如果你將知識點放到你的xmind知識框架圖上面,

你會發現只需要花半個小時快速充電就能把之前看的知識點重新記起來了。

 

知識框架梳理

 

   上面是本人的知識框架圖,這裏有非常凌亂的知識點,但是總結來說有由幾個方面組成

  1. java虛擬機相關知識
  2. java併發juc相關知識
  3. 分佈式事務、分佈式系統全家桶,rocketmq隊列,dubbo遠程rpc,netty知識等
  4. ssm相關知識
  5. 數據庫相關知識(關係型數據庫/非關係型數據庫)
  6. 運維相關知識,linux、tcp、http等

 

核心知識框架圖

    那麼這些知識點是怎麼積累進來的呢,下面我以JUC的學習過程爲例子來講解我的知識框架圖記錄過程,

首先我們知道,JUC就是java.util.concurrent包,俗稱java併發包,那首先我們要知道java併發包是用來幹嘛

的,然後要知道java併發包包括哪些知識點,這些知識點在平常中有哪些重要的運用,簡單來說,這個學習

方法就三個點,是什麼?爲什麼?怎麼辦?

  

     上面是JUC的地址,JUC位於rj.jar中,大家知道rj.jar屬於bootstrap classloader加載的內存,通過雙親委派機制去加載

其到我們JVM的方法區中使用,通過查看JUC的結構,我們會發,JUC下面有兩個子包,分別是atomic和locks,

atomic即原子類,說到這個東西可牛逼了,CAS,說到這三個字母,相信大家不陌生了吧,打開這個package,然後把

源碼看懂,你說發現其實就是這麼回事,但是把這個技能get到,基本上面試官已經沒法在CAS裏面難得倒你了,我們

發現此包經常用到的類AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference、AtomicStampedReference等,

然後打開源碼包我們可以看到其實這些方法是調用Unsafe類提供compareAndSwapObject、compareAndSwapInt、compareAndSwapLong等方法,Unsafe類又是什麼鬼呢,這個東西可就厲害了,他的全稱是sun.misc.Unsafe,這個類是

屬於JNI的類,Unsafe裏面的native方法直接操作內存,getUnfate()僅供高級的Bootstrap類加載器使用,其實就是直接操作

CPU嗎,那麼,compareAndSwap這個鬼東西也就變得很淺顯了,其實就是調用了CPU的系統原語,系統原語簡單來說就是

CPU的一個不能再分割指令,所以比較和執行是在CPU原子操作的,而不是像之前一樣,從工作內存考唄到執行引擎,

這裏就不是一個命令那麼簡單,所以CPU搞定的事情就是要比考唄再去執行要靠譜。AtomicInteger、AtomicLong的compareAndSet、AtomicReference基於unsafe.compareAndSwapInt和unsafe.compareAndSwapLong和unsafe.compareAndSwapObject,那麼AtomicStampedReference又是用來幹嘛的呢,看了之後發現端倪了,其實他就是用來解決

ABA問題,AtomicStampedReference原子類是一個帶有時間戳的對象引用。

 

 

 

   下面我們在來看看併發包裏面的locks package裏面的知識,這裏面有什麼呢,這個package裏面的核心

其實就是AbstractQueuedSynchronizer,這個鬼東西也有個牛逼霸氣的名字,AQS,相信大家聽到這個名字

就並不陌生了吧,lock的實現我們比較常見的有ReentrantLock(重入鎖),ReadWriteLock讀寫鎖等,

那麼鎖又是怎麼實現的呢,我們先從AQS的源碼入手去看,會發現AbstractQueuedSynchronizer有個核心的

內部類就做Node,Node裏面有EXCLUSIVE,SHARED兩種模式,即共享和獨佔,而我們的鎖Lock和Sychronized

都是屬於獨佔鎖,這個類裏面有兩個核心的方法,一個是tryAcquire,一個是tryRelease,我們發現這兩個

方法是用protected修飾的,再看看ReentranLock的源碼,我們會發現其實重入鎖是實現了tryAcquire和

tryRelease實現的~具體細節可以自己查看。

     前面我們講解了CAS和AQS這兩個東西,後面我們再來講講另外一個東西吧,Synchronized,相信大家對它還是挺熟悉

的吧,那它又是怎麼實現的呢,它的實現原理和lock比較相似,但是又存在差異,它是由monitor管程去的ObjectMonitor來

實現請求和等待的,ObjectMonitor中有兩個隊列,_WaitSet 和 _EntryList,用來保存ObjectWaiter對象列表( 每個等待鎖的線程都

會被封裝成ObjectWaiter對象),_owner指向持有ObjectMonitor對象的線程,當多個線程同時訪問一段同步代碼時,首先會進入

_EntryList 集合,當線程獲取到對象的monitor 後進入 _Owner 區域並把monitor中的owner變量設置爲當前線程同時monitor中的計

數器count加1,若線程調用 wait() 方法,將釋放當前持有的monitor,owner變量恢復爲null,count自減1,同時該線程進入 WaitSet

集合中等待被喚醒。若當前線程執行完畢也將釋放monitor(鎖)並復位變量的值,以便其他線程進入獲取monitor(鎖)。準確來講上面

講的屬於Synchronized重量級鎖的實現部分,Synchronized在進行重量級鎖之前會先歷經,偏向鎖,輕量級鎖和自旋鎖,不直接

切換成重量級鎖的原因是重量級鎖需要進行操作系統Mutex Lock來實現,線程之間的切換需要從用戶狀態到核心態。

 前面講解的是java併發包裏面的CAS和AQS和Synchronized,瞭解完這些知識點我們對併發包已經一定理解,但是併發包除了這些之外還有很多知識。比如tools工具,executor多線程相關類庫,還有collections java集合類的併發實現等。

 

     那麼基於我們對JUC的學習和了解我們可以將其總結爲剛剛的幾個點,這樣子我們就可以來做我們的知識框架圖了,比如

我們對某個知識點理解欠缺深入就可以針對的將其列入框架圖中,下面是適用於本人的JUC知識框架圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章