如何深入學習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以及其他基本用法,隨后通過相應的面試技巧,結合項目證明並發技術,以此找到能提供並發實踐機會的項目,在項目中真正提升並發技術。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM