如何深入學習Java併發編程?

    在講解深入學習Java併發編程的方法之前,先分析如下若干錯誤的觀點和學習方法。

錯誤觀點1:學習Java編程主要是學習多線程。

    這話其實是說明了表面現象,多線程其實還真是併發編程的實現方式,但在實際高併發的項目裏,程序員一般不會通過多線程去實現併發的需求,而是通過使用一些後文會提到的高併發組件來實現高併發的需求。

    甚至可以這樣說,線程方面的技能對實現高併發需求的幫助很少,與其用很多精力去學多線程併發,還不如花精力去學組件乃至應對高併發的集羣。

錯誤觀點2:爲了學好併發編程,要深入瞭解相關算法和底層實現原理。

    嚴格來說,這句話不能算錯,但學習併發編程算法和底層原理時,要講究學習的時機。

    一般來說,學併發編程的過程是,會用組件以及API,能(通過日誌)解決並排查相關問題,能搭建解決高併發的架構。在剛開始學併發編程乃至用併發編程技術幹活時,其實沒必要用大量的精力去了解算法和底層原理,只有當進階成架構師乃至資深架構師時,纔有必要學原理和底層源碼,而且還不是全學,而是針對要解決的問題,針對性地看算法和源碼。

錯誤觀點3:單憑看書和看視頻等資料,能學好Java併發編程。

    通過看書看資料,確實能瞭解併發編程的一些技術和方法,但如果不實踐,甚至連併發編程相關的API都用不好,更別論解決併發問題和搭建能應對高併發的框架。

    而且,由於在個人電腦上不能模擬高併發場景,所以通過學習,只能掌握個皮毛,能學到能應對高併發面試的程度,如果學習方法不當,甚至連通過面試的程度都達不到。要學好併發編程,只能是先通過面試得到相關的實踐機會,在項目中學。

    學習Java併發編程的目的是,掌握應對類似雙十一等場景的高併發技術,並能以此進入好公司,拿到更高的工資。從應用角度來看,Java併發編程包含了如下方面的技術。

    1 在應對高併發需求的項目中,一般會把業務模塊部署在多個服務器上,以此形成集羣,用nginx等組件進行負載均衡,同時限流。

    2 爲了減緩因高併發請求對數據庫產生的壓力,一般會在系統裏引入Redis緩存,甚至是Redis集羣,或者用數據庫主從集羣來進行讀寫分離,或者引入MyCAT組件來進行分庫分表,把一張大表拆分成若干子表,降低每次請求數據的數據樣本。

    3 系統裏不同的模塊處理請求的速度是不同的,比如訂單模塊一秒能處理5000個請求,而風控模塊一秒才能出3000個,對此可以引入消息中間件,或者可以用消息中間件來異步處理業務。

    4 爲了應對高併發,系統裏的模塊一般不會用RestFul的方式相互調用,而會直接用RPC的方式,所以在學習Java併發技術的過程中,程序員還要掌握Dubbo以及對應的Zookeeper註冊中心技術。

    在實際項目開發過程中,實現高併發的方式是通過組件,進而用組件搭建集羣,而不是程序員在理解限流熔斷負載均衡等算法和原理的基礎自己實現限流負載均衡和熔斷等模塊。

    看到這裏大家可以自己想一下,哪怕你根據一些所謂的學習路線,學會了final、violate、選舉算法、多線程對象和鎖的相關原理和算法等知識以後,其實用處不大,再囉嗦一下,在項目中還是沒法入門併發編程,因爲項目是靠組件,而不是算法和底層對象等來實現併發。

    再具體地講Java併發編程,分爲如下幾個層次。

    1 瞭解理論,會用API開發功能,比如會用Redis的API緩存數據。

    2 能根據項目的高併發需求,使用組件解決實際問題,比如會用Kafka組件實現高併發場景下的異步處理或消息緩存的流程,同時能根據實際需求,配置Kafka或dubbo等組件的參數。

    3 使用組件實現高併發需求時,能解決遇到的實際問題。比如項目中遇到Netty或Dubbo方面的OOM問題,能通過查資料和查日誌解決。

    4 熟練掌握擴容、搭建集羣和部署組件和業務模塊的技術,能在一無所有的前提下,幫助項目組搭建一個能應對高併發的系統,同時能解決裏面的問題。

    其中對Java初級開發而言,最好需要掌握第一個層次的技能,對Java高級開發而言,需要掌握第二層次的技能,最好再要有一定的解決分佈式組件問題的經驗,即需要部分達到第三層次的標準。而Java架構師一定得達到第三層次的標準,至於第四層次的標註,是針對資深架構而言的。

    講到這裏大家其實可以理解,平時在併發層面出現頻率不少的鎖、原子類或Synchronized等技術,其實是包含在Netty,Dubbo或Kafka等組件背後的原理或實現機制,學好了不能說沒用,但也就是聊勝於無,或者說頂多面試時能用到,平時項目開發中未必會直接用到這些原理或底層算法。

    舉例來說吧,比如要實現高併發場景下的分佈式鎖,大多數項目的做法是用Seata等組件,通過配置和API實現分佈式鎖裏的提交或回滾等功能,而絕不是自己根據二階段提交等算法,自己設計開發一套實現分佈式鎖的組件。

    上文用了不少篇幅,給出了項目組實現java高併發的一些方式以及實現併發編程的幾個層次,在這基礎上,大家就能很好地理解後文給出的Java併發編程的學習路徑和學習技巧了。

    講到這裏,本人忍不住要吐槽,其實在不少公司的項目裏,程序員是隻要求用增刪改查的API開發業務,項目沒有高併發的需求,對應的程序員其實是沒有機會全面接觸到高併發技術的,或者頂多用到些組件的API,或者是用到高併發組件或技術裏的一部分。

    在沒有在項目實踐中全面接觸到Java高併發技術,並解決過高併發產線問題的前提下,認爲併發編程技術就是Java多線程中的一些技術,或者是一些諸如線程互斥或調度等算法,這也是可以理解的,但本人好歹在一些大廠呆過,多少接觸過一些高併發需求和技術,也多少解決過一些實際問題,所以下文給出的學習路徑和學習技巧應當對大家有幫助。

    1 一步步來,剛開始的時候,就學一些高併發組件的API,這裏的組件是指Redis,nginx,dubbo,mycat,dubbo或zookeeper組件,或者是spring cloud alibaba體系下的nacos,sentinel,gateway,ribbon或seata組件,這是兩個不同的方向,學好一個方向即可。

    這裏需要說明的是,學的時候絕不能但看理論,更要動手實踐,如果項目裏有用這些組件的機會,就從項目裏學,否則的話,就在自己的電腦上搭建個環境學。

    2 在自學階段,由於缺乏項目實踐機會,其實只能掌握到“熟悉組件API”的程度。有些程序員在工作中有分佈式組件的實踐機會,或者還能結合項目來學,但大多數程序員,真是因爲在平時項目開發過程中只接觸到基本技能,所以纔要通過自學來掌握分佈式高併發的技能。

    自學階段需要達成的目標一般不是熟練掌握高併發相關的實踐技能,而是能在未來的面試中證明自己有高併發相關的項目經驗。

    3 通過自學組件或其他技能,能讓自己掌握基本但必需的分佈式高併發技能後,就要準備面試,爭取挑戰大廠或互聯網公司的那些真正能提供高併發項目實踐機會的職位。

    在這個階段,由於程序員一般只具有併發方面的理論知識,或是api技能,頂多外帶些實際應用和解決相關問題的經驗,所以在這個準備面試階段,可以採用“項目嫁接”的技巧,即儘量在你當前做的項目裏,結合該技術的項目使用情況,這樣就能證明該併發技術項目實踐經驗,進而能證明大多數併發技術有項目實踐經驗。

    比如對於基於redis的緩存技術,大家可以在熟悉基本緩存和讀取數據的api前提下,爲緩存找個項目需求落腳點,比如因爲在本項目裏,多次去查詢用戶數據會導致性能慢,所以會引入redis。引入後redis的鍵是什麼,值是什麼,同時設的超時是多少,解決過緩存穿透問題,同時用RDB的方式做redis持久化。

    當然,在面試中證明併發技術的項目實踐經驗也是個互動的過程,你說了以後,面試官會問細節問技術,所以在爲技術找好項目實踐背景後,還要背題,比如背redis面試題,甚至去看redis背後的線程和緩存處理流程。但還是這句話:如果但學算法和細節,不證明相關技術的項目實踐經驗,一定沒發通過面試。

    4 通過了解併發技術外帶按上文準備好面試說辭,當然再需要經過多次面試試錯,程序員一般有機會找到能真正提供併發技術實踐機會的公司和項目。

    上文說了,這些公司和項目不多,但程序員如果準備得當,不是找不到這種機會,畢竟不少互聯網大廠的面試機會擺在那裏,而且也有不少程序員,甚至是初級開發的程序員通過準備面試技巧成功地進大廠。

    當大家真正在互聯網等公司全面接觸到高併發技術以後,甚至都不用問,就能背項目推動着,自行不斷地積累並深化java高併發技術,因爲在這種項目裏,不僅需要大量接觸高併發的需求,還需要不斷地搭建集羣,同時解決限流熔斷等實際問題,當然還需要不斷解決併發方面的線上問題。

    到了這個階段,其實大家就能發現,我上文給出的一些併發學習的觀點不能說沒有道理,甚至可能有不少架構師會贊同我的上述論斷。

    1 那些java多線程、鎖或併發對象,以及相關的算法和原理,不能說一點用都沒有,可能一些資深架構在排查問題時,需要接觸到這些底層源碼或對象,但這已經是很後面的事情。但至少在學習併發技術的開始階段,不需要用這些技術打基礎。這些技術的價值頂多是讓你背,讓你以此過面試。

    2 在開始階段,學java併發技術就是學和用分佈式組件,這句話雖然會引起爭議,但通過分佈式組件入門java併發技術,至少也是個學習路線。畢竟在真正的高併發項目裏,是通過相關組件來實現限流,熔斷和負載均衡等高併發需求的。

    3 學併發技術可以分兩階段走,第一步通過項目或自學,瞭解組件或相關技術的基本api以及其他基本用法,隨後通過相應的面試技巧,結合項目證明併發技術,以此找到能提供併發實踐機會的項目,在項目中真正提升併發技術。

 

如果大家想進一步瞭解寫簡歷和麪試方面的技能,可以關注我。

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