面試一家小公司,被問了 1 個小時並發編程。。全程已記錄!


最近有讀者投簡歷去一家小公司去面試的時候,和面試官聊了一個小時的並發編程,整個過程已全記錄下來。

面試的時候小心翼翼,如履薄冰,生怕說錯一句話,就錯失機會,擔心,面試緊張、卡殼。不知道大家有沒有這個問題?

面試官:你知道CAS嗎,能跟我講講嗎?

我:CAS(Compare And Swap),比較並交換。整個AQS同步組件,Atomic原子類操作等等都是基於CAS實現的,甚至ConcurrentHashMap在JDK1.8版本中,也調整為CAS+synchronized。可以說,CAS是整個JUC的基石。

CAS的實現方式其實不難。在CAS中有三個參數:內存值V、舊的預期值A、要更新的值B,當且僅當內存值V的值等於舊的預期值A時,才會將內存值V的值修改為B,否則什么也不干,是一種樂觀鎖。其偽代碼如下:

我:接着我舉了個AtomicInteger的例子,來給面試官闡述CAS的實現。

面試官:那CAS有什么缺陷嗎?

我:CAS雖然高效的解決了原子問題,但是還是存在一些缺陷的,主要體現在三個方面: 

 

1.循環時間太長:

如果自旋CAS長時間不成功,則會給CPU帶來非常大的開銷,在JUC中,有些地方就會限制CAS自旋的次數。 

2.只能保證一個共享變量原子操作:

看了CAS的實現就知道這只能針對一個共享變量,如果是多個共享變量就只能使用鎖了。或者把多個變量整成一個變量也可以用CAS。 

3.ABA問題:

CAS需要檢查操作值有沒有發生改變,如果沒有發生改變則更新,但是存在這樣一種情況:如果一個值原來是A,變成了B,然后又變成了A,那么在CAS檢查的時候會發現沒有改變,但是實質上它已經發生了改變,這就是所謂的ABA問題。對於ABA問題的解決方案是加上版本號,即在每個變量都加上一個版本號,每次改變時加1,即A->B->A,變成1A->2B->3A。例如原子類中AtomicInteger會發生ABA問題,使用AtomicStampedReference可以解決ABA問題。

 

面試官:你能說下輕量級鎖嗎?

面試官:你先說下你對synchronized的了解。

面試官:什么是原子操作?

面試官:什么是Executors框架?

面試官:什么是阻塞隊列?阻塞隊列的實現原理是什么?如何使用阻塞隊列來實現生產者-消費者模型?

面試官:CycliBarriar和CountdownLatch有什么區別?

面試官:Java中用到的線程調度算法是什么?

我:....................................

總結:

面試的時候,開口第一句,面試官就知道你的水平了。你很多東西用過,但是並不懂底層原理,面試官一問,你就啞火了…

並發編程中涉及到的知識點其實挺多,工作多年的程序員,應該掌握哪些技術?如何才能在大廠面試中侃侃而談,在無數競爭對手中脫穎而出?

為了給在工作和技術上遇到瓶頸的小伙伴找到發展方向,徹底要把這塊技術掌握好,我最近在看一本關於JAVA並發編程的一本書《Java並發編程實踐》,這本對並發編程的核心技術了解很透徹,下面給大家看看部分截圖:

本書快速下載通道:點擊這里,暗號777!

結合面試題一起來學習,更加有效,我這里也把我這幾天在網上看到的並發編程面試題都整理出來了,都是一些大廠常見的面試題。

面試題快速下載通道:點擊這里,暗號777!

並發編程面試題:

問 題 一 : Synchronized 用 過 嗎 , 其 原 理 是 什 么 ?
問 題 二 : 你 剛 才 提 到 獲 取 對 象 的 鎖 , 這 個 “ 鎖 ” 到 底 是 什 么 ? 如 何 確 定 對 象 的 鎖 ?
問 題 三 : 什 么 是 可 重 入 性 , 為 什 么 說 Synchronized 是 可 重 入 鎖 ?
問 題 四 : JVM 對 Java 的 原 生 鎖 做 了 哪 些 優 化 ?
問 題 五 : 為 什 么 說 Synchronized 是 非 公 平 鎖 ?
問 題 六 : 什 么 是 鎖 消 除 和 鎖 粗 化 ?
問 題 七 : 為 什 么 說 Synchronized 是 一 個 悲 觀 鎖 ? 樂 觀 鎖 的 實 現 原 理 又 是 什 么 ? 什 么 是 CAS, 它 有 什 么 特 性 ?
問 題 八 : 樂 觀 鎖 一 定 就 是 好 的 嗎 ?
 

可 重 入 鎖 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 需 要 注 意 些 什 么 ?

 

最后:

面試官問你一些問題其實並不是想要難倒你,也不會因為你答不上來而去拒絕你,大多數的面試官只是想了解你掌握的知識程度在哪里,所以說我們去面試的時候一定擺正心態,不要以為面試官問你這么多只是因為裝X ,祝大家可以拿到自己想要大廠offer,年薪百萬~~~


免責聲明!

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



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