最近有讀者投簡歷去一家小公司去面試的時候,和面試官聊了一個小時的并發編程,整個程序已全記錄下來,
面試的時候小心翼翼,如履薄冰,生怕說錯一句話,就錯失機會,擔心,面試緊張、卡殼,不知道大家有沒有這個問題?
面試官:你知道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,年薪百萬~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/240356.html
標籤:其他
