最近有讀者投簡歷去一家小公司去面試的時(shí)候歧匈,和面試官聊了一個(gè)小時(shí)的Java并發(fā)編程垒酬,整個(gè)過程已全記錄下來。面試的時(shí)候小心翼翼件炉,如履薄冰勘究,生怕說錯(cuò)一句話,就錯(cuò)失機(jī)會(huì)斟冕,擔(dān)心口糕,面試緊張、卡殼磕蛇。不知道大家有沒有這個(gè)問題景描?
面試過程
面試官: 你知道CAS嗎,能跟我講講嗎秀撇?
我: CAS(Compare And Swap)超棺,比較并交換。整個(gè)AQS同步組件捌袜,Atomic原子類操作等等都是基于CAS實(shí)現(xiàn)的,甚至ConcurrentHashMap在JDK1.8版本中炸枣,也調(diào)整為CAS+synchronized虏等∨螅可以說,CAS是整個(gè)JUC的基石霍衫。
CAS的實(shí)現(xiàn)方式其實(shí)不難候引。在CAS中有三個(gè)參數(shù):內(nèi)存值V、舊的預(yù)期值A(chǔ)敦跌、要更新的值B澄干,當(dāng)且僅當(dāng)內(nèi)存值V的值等于舊的預(yù)期值A(chǔ)時(shí),才會(huì)將內(nèi)存值V的值修改為B柠傍,否則什么也不干麸俘,是一種樂觀鎖。其偽代碼如下:
我: 接著我舉了個(gè)AtomicInteger的例子惧笛,來給面試官闡述CAS的實(shí)現(xiàn)从媚。
面試官: 那CAS有什么缺陷嗎?
我: CAS雖然高效的解決了原子問題患整,但是還是存在一些缺陷的拜效,主要體現(xiàn)在三個(gè)方面:
1.循環(huán)時(shí)間太長: 如果自旋CAS長時(shí)間不成功,則會(huì)給CPU帶來非常大的開銷各谚,在JUC中紧憾,有些地方就會(huì)限制CAS自旋的次數(shù)。
2.只能保證一個(gè)共享變量原子操作: 看了CAS的實(shí)現(xiàn)就知道這只能針對(duì)一個(gè)共享變量昌渤,如果是多個(gè)共享變量就只能使用鎖了赴穗。或者把多個(gè)變量整成一個(gè)變量也可以用CAS愈涩。
3.ABA問題: CAS需要檢查操作值有沒有發(fā)生改變望抽,如果沒有發(fā)生改變則更新,但是存在這樣一種情況:如果一個(gè)值原來是A履婉,變成了B煤篙,然后又變成了A,那么在CAS檢查的時(shí)候會(huì)發(fā)現(xiàn)沒有改變毁腿,但是實(shí)質(zhì)上它已經(jīng)發(fā)生了改變辑奈,這就是所謂的ABA問題。對(duì)于ABA問題的解決方案是加上版本號(hào)已烤,即在每個(gè)變量都加上一個(gè)版本號(hào)鸠窗,每次改變時(shí)加1,即A->B->A胯究,變成1A->2B->3A稍计。例如原子類中AtomicInteger會(huì)發(fā)生ABA問題,使用AtomicStampedReference可以解決ABA問題裕循。
面試官: 你能說下輕量級(jí)鎖嗎臣嚣?
面試官: 你先說下你對(duì)synchronized的了解净刮。
面試官: 什么是原子操作?
面試官: 什么是Executors框架硅则?
面試官: 什么是阻塞隊(duì)列淹父?阻塞隊(duì)列的實(shí)現(xiàn)原理是什么?如何使用阻塞隊(duì)列來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型怎虫?
面試官: CycliBarriar和CountdownLatch有什么區(qū)別暑认?
面試官: Java中用到的線程調(diào)度算法是什么?
我: 淦大审,年輕人不講武德
總結(jié)
面試的時(shí)候蘸际,開口第一句,面試官就知道你的水平了饥努。你很多東西用過捡鱼,但是并不懂底層原理,面試官一問酷愧,你就啞火了… 并發(fā)編程中涉及到的知識(shí)點(diǎn)其實(shí)挺多驾诈,工作多年的程序員,應(yīng)該掌握哪些技術(shù)溶浴?如何才能在大廠面試中侃侃而談乍迄,在無數(shù)競爭對(duì)手中脫穎而出?
為了給在工作和技術(shù)上遇到瓶頸的小伙伴找到發(fā)展方向士败,徹底要把這塊技術(shù)掌握好闯两,分享這些并發(fā)學(xué)習(xí)筆記手冊(cè)及真題解析和配套視頻給有需要的小伙伴,這些學(xué)習(xí)資源都對(duì)Java并發(fā)核心解析得很透徹谅将,還結(jié)合了面試真題漾狼。
由于篇幅原因,本文只展示了目錄和內(nèi)容截圖有需要學(xué)習(xí)的小伙伴只需點(diǎn)贊后添加VX:czh9115 即可來免費(fèi)領(lǐng)取了饥臂!