面試必問的併發編程知識點,你知道多少?

前言

衆所周知,在Java的知識體系中,併發編程是非常重要的一環,也是面試的必問題,一個好的Java開發者是必須對併發編程這塊有所瞭解的。

而如何在併發場景中寫出優良的代碼,是一道繞不開的坎,也是考量一個 Java 開發者功底的關鍵技術。因此,不難發現 Java
併發問題一直是各個大廠面試的重點之一,然而我發現很多候選人在面試時,常常表示對各種併發原理一臉懵逼,好像知道一些卻又講不清楚,最終導致面試失敗。於是發奮學習,啃大部頭書又發現理論太多,頭疼。其實
Java 的併發問題雖然內容繁雜,然而整個脈絡還是很清晰的。那麼接下來,一起來看看面試中會問到哪些併發的知識點。

線程池相關問題

問題一:Java 中的線程池是如何實現的?
問題二:創建線程池的幾個核心構造參數?
問題三:線程池中的線程是怎麼創建的?是一開始就隨着線程池的啓動創建好的嗎?
問題四:既然提到可以通過配置不同參數創建出不同的線程池,那麼 Java 中默認實現好的線程池又有哪些呢?請比較它們的異同。
問題五:如何在 Java 線程池中提交線程?

線程安全和線程同步器相關問題

問題一:java如何實現多線程之間的通訊和協作?
問題二:什麼叫線程安全?servlet是線程安全嗎?
問題三:同步有幾種實現方法?
問題四:volatile有什麼用?能否用一句話說明下volatile的應用場景?
問題五:請說明下java的內存模型及其工作流程。
問題六:爲什麼代碼會重排序?
問題七:分析下JUC 中倒數計數器 CountDownLatch 的使用與原理?
問題八:CountDownLatch 與線程的 Join 方法區別是什麼?
問題九:講講對JUC 中迴環屏障 CyclicBarrier 的使用?
問題十:CyclicBarrier內部的實現與 CountDownLatch 有何不同?
問題十一:Semaphore 的內部實現是怎樣的?
問題十二:簡單對比同步器實現,談談你的看法?
問題十三:併發組件CopyOnWriteArrayList 是如何通過寫時拷貝實現併發安全的 List?

內存模型相關問題

問題一:什麼是 Java 的內存模型,Java 中各個線程是怎麼彼此看到對方的變量的?
問題二:請談談 volatile 有什麼特點,爲什麼它能保證變量對所有線程的可見性?
問題三:既然 volatile 能夠保證線程間的變量可見性,是不是就意味着基於 volatile 變量的運算就是併發安全的?
問題四:請對比下 volatile 對比 Synchronized 的異同。
問題五:請談談 ThreadLocal 是怎麼解決併發安全的?
問題六:很多人都說要慎用 ThreadLocal,談談你的理解,使用 ThreadLocal 需要注意些什麼?

鎖相關問題

問題一:什麼是可重入鎖、樂觀鎖、悲觀鎖、公平鎖、非公平鎖、獨佔鎖、共享鎖?
問題二:當一個線程進入某個對象的一個synchronized的實例方法後,其它線程是否可進入此對象的其它方法?
問題三:synchronized和java.util.concurrent.locks.Lock的異同?
問題四:什麼是鎖消除和鎖粗化?
問題五:樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?
問題六:如何實現樂觀鎖(CAS)?如何避免ABA問題?
問題七:讀寫鎖可以用於什麼應用場景?
問題八:什麼是可重入性,爲什麼說 Synchronized 是可重入鎖?
問題九:什麼時候應該使用可重入鎖?
問題十:什麼場景下可以使用volatile替換synchronized?

併發框架和併發隊列相關問題

問題一:SynchronizedMap和ConcurrentHashMap有什麼區別?
問題二:CopyOnWriteArrayList可以用於什麼應用場景?
問題三:如何讓一段程序併發的執行,並最終彙總結果?
問題四:任務非常多的時候,使用什麼阻塞隊列能獲取最好的吞吐量?
問題五:如何使用阻塞隊列實現一個生產者和消費者模型?
問題六:多讀少寫的場景應該使用哪個併發容器,爲什麼使用它?
問題七:談下對基於鏈表的非阻塞無界隊列 ConcurrentLinkedQueue 原理的理解?
問題八:ConcurrentLinkedQueue 內部是如何使用 CAS 非阻塞算法來保證多線程下入隊出隊操作的線程安全?
問題九:基於鏈表的阻塞隊列 LinkedBlockingQueue 原理。
問題十:阻塞隊列LinkedBlockingQueue 內部是如何使用兩個獨佔鎖 ReentrantLock 以及對應的條件變量保證多線程先入隊出隊操作的線程安全?
問題十一:爲什麼不使用一把鎖,使用兩把爲何能提高併發度?
問題十二:基於數組的阻塞隊列 ArrayBlockingQueue 原理。
問題十三:ArrayBlockingQueue 內部如何基於一把獨佔鎖以及對應的兩個條件變量實現出入隊操作的線程安全?
問題十四:談談對無界優先級隊列 PriorityBlockingQueue 原理?
問題十五:PriorityBlockingQueue 內部使用堆算法保證每次出隊都是優先級最高的元素,元素入隊時候是如何建堆的,元素出隊後如何調整堆的平衡的?

CountDownLatch相關問題

問題一:介紹一下 CountDownLatch 工作原理?
問題二:CountDownLatch 和 CyclicBarrier 的區別?
問題三:CountDownLatch 的使用場景?
問題四:CountDownLatch 類中主要的方法?

最後

上述很多知識點都會在我的公衆號《Java技術zhai》中涉及到,我會站在 理論、模型的角度 講解 Java 併發,讓你融匯貫通,形成 全面系統的併發編程知識體系 。最終可以 得心應手地解決各種併發難題,同時將這些知識用於其他編程語言。

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