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

前言

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

然而不管是哪一個國家,什麼背景的 Java 開發者,都對本身寫的併發程序至關自信,但也會在出問題時表現得很詫異甚至束手無策。程序員

可見,Java 併發編程顯然不是一件能速成的能力,基礎搭得越好,越全面,在實踐中才會有更深入的理解。面試

所以,你們不難發現 Java 併發問題一直是各個大廠面試的重點之一。我在平時的面試中,也發現不少候選人對一些基本的併發概念表示沒聽過,或原理不理解,可能知道一些卻又講不清楚,最終致使面試失敗。sql

本文會結合實際中接觸到的一些面試題,重點來聊一聊 Java 併發中的相關知識點。編程

Synchronized 相關問題

問題一:Synchronized 用過嗎,其原理是什麼?安全

問題二:你剛纔提到獲取對象的鎖,這個「鎖」究竟是什麼?如何肯定對象的鎖?架構

問題三:什麼是可重入性,爲何說 Synchronized 是可重入鎖?併發

問題四:JVM 對 Java 的原生鎖作了哪些優化?框架

問題五:爲何說 Synchronized 是非公平鎖?編程語言

問題六:什麼是鎖消除和鎖粗化?

問題七:爲何說 Synchronized 是一個悲觀鎖?樂觀鎖的實現原理又是什麼?什麼是

問題八:樂觀鎖必定就是好的嗎?

可重入鎖 ReentrantLock 及其餘顯式鎖相關問題

問題一:跟 Synchronized 相比,可重入鎖 ReentrantLock 其實現原理有什麼不一樣?

問題二:那麼請談談 AQS 框架是怎麼回事兒?

問題三:請儘量詳盡地對比下 Synchronized 和 ReentrantLock 的異同。

問題四:ReentrantLock 是如何實現可重入性的?

問題五:除了 ReetrantLock,你還接觸過 JUC 中的哪些併發工具?

問題六:請談談 ReadWriteLock 和 StampedLock。

問題七:如何讓 Java 的線程彼此同步?你瞭解過哪些同步器?請分別介紹下。

問題八:CyclicBarrier 和 CountDownLatch 看起來很類似,請對比下呢?

Java 線程池相關問題

問題一:Java 中的線程池是如何實現的?

問題二:建立線程池的幾個核心構造參數?

問題三:線程池中的線程是怎麼建立的?是一開始就隨着線程池的啓動建立好的嗎?

問題四:既然提到能夠經過配置不一樣參數建立出不一樣的線程池,那麼 Java 中默認實現好的線程池又有哪些呢?請比較它們的異同。

問題五:如何在 Java 線程池中提交線程?

Java 內存模型相關問題

問題一:什麼是 Java 的內存模型,Java 中各個線程是怎麼彼此看到對方的變量的?

問題二:請談談 volatile 有什麼特色,爲何它能保證變量對全部線程的可見性?

問題三:既然 volatile 可以保證線程間的變量可見性,是否是就意味着基於 volatile 變量的運算就是併發安全的?

問題四:請對比下 volatile 對比 Synchronized 的異同。

問題五:請談談 ThreadLocal 是怎麼解決併發安全的?

問題六:不少人都說要慎用 ThreadLocal,談談你的理解,使用 ThreadLocal 須要注意些什麼?

如何學習併發編程

學習java併發就像進入了另一個學習領域,就像學習一門新的編程語言,或者是學習一套新的語言概念,要理解併發編程,其難度跟理解面向對象編程難度差很少。你花一點功夫,就能夠理解它的基本機制,可是要想真正掌握它的本質,就須要深刻的學習與理解。最後在分享一個併發編程知識的學習導圖給你們!

結語

最後我把這些實際遇到的併發編程面試題及常見問題的答案總結了一下,因爲文字過多,就單獨作了一個文檔。以及準備了一些更多關於Kafka、Mysql、Tomcat、Docker、Spring、MyBatis、Nginx、Netty、Dubbo、Redis、Netty、Spring cloud、分佈式、高併發、性能調優、微服務等架構面試題和架構資料,若有須要的朋友的能夠點擊免費領取,也能夠關注我之後還會有更多幹貨分享!

相關文章
相關標籤/搜索