本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫
為什麼要學並發編程
我曾聽一個從事15年開發工作的技術人員說過,他剛工作時的並發編程第一原則就是不要寫並發程序。這個不寫並發程序的原則行得通的背景是那個時候基本都是單核處理器,系統並發量很低,藉助資料庫和類似Tomcat這種中間件就可以解決並發問題。
如今硬體的驅動和網際網路行業的飛速發展,64核的處理器已經是很常見了,大型互聯廠商的系統並發量輕鬆過百萬,傳統的中間件和資料庫肯定是不能幫我們遮風避雨了,我們只能通過並發編程來解決這些問題。
所以,並發編程已經成為一項必備技能。
並發編程是Java語言的重要特性之一,它能使複雜的代碼變得更簡單,從而極大地簡化複雜系統的開發。
並發編程可以充分發揮多處理器系統的強大計算能力,隨著處理器數量的持續增長,如何高效的並發變得越來越重要。
說白了,對我們程式設計師來說,並發編程在日常工作中是都要用到的,就算目前沒用到將來也要用到,工作中用不到面試也要用到。
如何學習並發編程
並發編程的學習確實有難度
《Java並發編程實戰》中這麼說,「編寫正確的程序難,編寫正確的並發程序更難」。
並發編程中涉及作業系統、CPU、內存等等多方面的知識,如果某一塊知識缺乏,理解起來自然會有困難。由於涉及知識較多,學習起來很容易摸不著頭緒,學習了一個點但是不能跟其他點聯繫起來。
理清脈絡,系統學習
並發編程的知識比較零散,相關度很低,總是給人一種感覺,「學習了很多相關知識,可還是沒搞懂是怎麼回事」。那麼,接下來就由我跟你一起來理一理Java並發編程的脈絡。
1.並發理論:並發編程要解決的三大問題;介紹可見性與有序性問題的根源重排序;學習Java內存模型(JMM),理解JMM如何解決這些問題以實現並發編程的。
2.並發關鍵字:深入volatile、synchronized、final關鍵字的作用,都解決了什麼問題,以及其實現原理。
3.並發基礎:並發編程中用到的一些基本概念,如:死鎖、飢餓與公平等;線程的創建、運行、調度。
4.CAS原子操作:並發編程的基礎與核心CAS的實現原理,以及Java中的CAS原子操作。
5.Lock體系:JDK的Lock對於synchronized有哪些優勢;Lock如何通過AQS與LockSupport工具實現的;Lock的使用。
6.並發工具:介紹java.util.concurrent包下提供的並發工具倒計時器CountDownLatch、循環柵欄CyclicBarrier、資源訪問控制Semaphore、數據交換Exchanger的用法,並深入分析實現原理。
7.並發容器:介紹java.util.concurrent包下提供的並發容器ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue、ThreadLocal、及阻塞隊列的用法,並深入分析實現原理。
8.線程池(Executor體系):介紹線程池ThreadPoolExecutor和ScheduledThreadPoolExecutor的用法,分析線程池執行流程和原理。
Java並發編程思維導圖
從今天起,我會通過一個專題的系列文章來系統地講解Java並發編程知識。如下給出Java並發編程的知識結構,也是這個系列文章的思路。