聊聊面試中關於併發問題的應對方案

圖片描述

主題java

又到面試季了,從羣裏,看到許多同窗分享了本身的面試題目,我也抽空在網上搜索了一些許多公司使用的面試題,目前校招和社招的面試題基本都集中在幾個大方向上,主要是:Java基礎、併發、JVM、算法、數據庫、一些框架、分佈式集羣 等。這裏呢,單獨就面試中的【併發】問題的準備和學習發表一下我的的看法。面試

現狀算法

關於對併發的學習和理解,經過你們在課程羣裏的反饋,總結一下,主要包含如下幾種:數據庫

徹底不知道併發的存在編程

知道併發要學,可是不知道該學習什麼緩存

知道併發重要,本身買相關書籍學,可是看完了仍是懵懵懂懂安全

知道併發重要,本身查資料學了一些,許多都學會了,但總能發現不會的,不知道併發到底都要學什麼多線程

已經完成進階,併發的問題了然於胸,這樣的小夥伴目前不多併發

首先說一下,爲何Java面試要考併發,並且併發相關的題目佔比又是那麼的高。對併發有必定了解的同窗,應該都知道,你們平時 只要作Java項目就會涉及到併發 ,個別同窗說本身從沒接觸過併發,這只是我的還沒意識到而已。當你定義好一個能夠調用的接口時,這時其實就已經和併發有關係了,由於任何一個接口均可能同時被請求屢次。當你在項目中已經能夠熟練的使用synchronized、volatile、static、final這些基本的Java關鍵字時,其實你對併發已經有一些基礎了。你們總說的:面試造火箭、入職擰螺絲,其實有一部分緣由也是由於你還沒意識到面試考的這些東西其實一直就伴隨着你的平常開發。框架

我蚍蜉撼樹的去列一下併發涉及到的關鍵字、類及能夠考察的知識點:CPU緩存、Java內存模型JMM、atomic、AtomicInteger、AtomicLong、LongAdder、AtomicReference、AtomicBoolean、CAS原理、Unsafe、synchronized、volatile、final、static、ThreadLocal、AQS、J.U.C、CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、ReentrantReadWriteLock、StampLock、Condition、FutureTask、Fork/Join、BlockingQueue、ThreadPoolExecutor、ExecutorService、Thread、Runnable、Future、Callable、HashMap、 HashTable、ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、RateLimiter、SimpleDateFormat、StringBuffer、StringBuilder、ArrayList、Vector、HashSet、ConcurrentSkipListSet、Collections.synchronizedXXX、Guava Cache、Redis ... 我嘗試去寫出腦海裏與併發有關的類和名詞,我發現根本寫!不!完!是的,併發的知識太多了,以至於很難給出一個完整的囊括。

所以呢,若是你盲目的一個知識點一個知識的去學,你就會發現你怎麼都學不完,也很難在腦海裏造成一個完整的知識體系,帶來的最直接結果就是,你每次去面試時都要去把併發相關的再過一下,生怕本身被問到還沒接觸的。這時候,你要作的就是,先要在腦海裏有一個完整的併發知識體系,而後根據這個體系去不斷完善這個體系裏每一個模塊的細節。想要詳細瞭解併發編程知識體系的能夠加羣:650385180,如下的高清腦圖已經放在羣裏面。

併發

關於併發的學習,能夠從JDK提供的併發包爲核心開始,許多其餘的類和封裝都是對其進行擴展或者補充,咱們來看一下Java併發包(java.util.concurrent包,簡稱J.U.C)的構成:

圖片描述

J.U.C核心由5大塊組成:atomic包、locks包、collections包、tools包(AQS)、executor包(線程池)。你們平時遇到許多併發相關的類均可以從這裏找到。可是呢,要想系統的掌握併發,不能是打開J.U.C這個包,挨個類去看,這裏只是提供了五大塊,表明核心的五個方向。要想系統的學習併發,能夠加羣650385180,而且還須要從併發的角度學習,過程當中覆蓋J.U.C的這些知識。這裏我直接給出併發的學習步驟圖(包含對當前面試常見考點的覆蓋,好比對HashMap和ConcurrentHashMap的源碼分析):
圖片描述

這個以前呢,還須要對Java併發的基礎進行細緻的學習,好比CPU緩存和Java內存模型(JMM),許多關鍵字好比volatile、synchronized等的特性都是在JMM裏規定好的。

高併發

咱們這篇手記題目裏提到的併發其實包含兩部分:併發和高併發。手記講到如今,其實咱們講的都是兩部分裏的第一部分:併發。那麼併發和高併發到底有什麼區別呢?許多小夥伴對這兩個概念都是模糊的,我簡單作一下區分。

當咱們說多線程併發時,其實咱們更多的是討論多個線程操做了相同的資源,這時咱們討論點更多的是落在保證線程安全以及合理分配和使用資源上。而高併發主要指系統運行過程當中遇到「短期內遇到大量操做請求」的狀況,主要發生在系統集中收到大量請求(例如:12306的搶票狀況;天貓雙十一活動)。當咱們說高併發時,咱們談的是是如何提升現有程序的性能,更多的是對高併發場景的一些解決方案,思路啦、手段等等。若是高併發處理很差,不只僅下降了用戶的體驗度(請求響應時間過長),同時可能致使系統宕機,嚴重的甚至致使OOM異常,系統中止工做等。這裏呢,我直接給出高併發場景一般都會考慮的一些解決思路和手段:
圖片描述

結尾

如何有效的準備面試中併發類問題,我已經給出個人理解。但願這些能幫你們在腦海裏創建起大體的併發知識體系,而後根據這個知識體系有針對性的的去準備面試。預祝你們能高分經過面試,拿到高薪!

固然,光提概念光看圖是沒用的,還須要你們根據這些提綱去實際學習相關的知識點和類才行。我已經準備好了這些實際知識點學習的流程,相信聰明的你已經知道該怎麼辦了~

相關文章
相關標籤/搜索