- 首頁(yè)|
- 網(wǎng)校|
- 焚題庫(kù)|
- APP |
-
微信公眾號(hào)
馬老師說(shuō)過(guò),員工的離職原因很多,只有兩點(diǎn)最真實(shí):
錢(qián),沒(méi)給到位
心,受委屈了
當(dāng)然,我是想換個(gè)平臺(tái),換個(gè)方向,想清楚為什么要跳槽,如果真的要跳槽,想要拿到一個(gè)理想的offer,除了運(yùn)氣,基本功也要足夠的扎實(shí),希望下面的面試經(jīng)驗(yàn)?zāi)芙o你們能夠提供一些幫助。
1項(xiàng)目經(jīng)驗(yàn)
面試官在一開(kāi)始會(huì)讓你進(jìn)行自我介紹,主要是想讓你介紹一下自己做過(guò)的一些項(xiàng)目,看看你對(duì)這些項(xiàng)目的了解程度,因?yàn)楹芏嗳撕?jiǎn)歷上寫(xiě)的項(xiàng)目并非都是從頭到尾都參與的,有些只是參與并實(shí)現(xiàn)了其中的一些模塊而已,或是接手維護(hù)別人的項(xiàng)目,所以在你簡(jiǎn)歷上所寫(xiě)的和面試過(guò)程中所說(shuō)的項(xiàng)目經(jīng)驗(yàn),你自己必須能夠了解來(lái)龍去脈,因?yàn)槊嬖嚬倏隙〞?huì)根據(jù)你的項(xiàng)目描述,對(duì)項(xiàng)目中的實(shí)現(xiàn)原理,或?yàn)槭裁匆@樣實(shí)現(xiàn)進(jìn)行提問(wèn),這時(shí)不至于木訥住而不知如何作答,如此局面只會(huì)大大降低面試分。
場(chǎng)景對(duì)話:
面試官:(拿著簡(jiǎn)歷)講講你最近做的這個(gè)項(xiàng)目
我:&……%¥#*&¥@%¥!,說(shuō)了一大通(不知道面試官聽(tīng)進(jìn)去多少,面試官會(huì)挑他會(huì)的進(jìn)行提問(wèn))
面試官:你說(shuō)這個(gè)項(xiàng)目中用到了netty,能大概講講netty的線程模型么?
我:(幸好我看過(guò)netty的源碼)netty通過(guò)Reactor模型基于多路復(fù)用器接收并處理用戶請(qǐng)求(能講就多講一點(diǎn)),內(nèi)部實(shí)現(xiàn)了兩個(gè)線程池,boss線程池和work線程池,其中boss線程池的線程負(fù)責(zé)處理請(qǐng)求的accept事件,當(dāng)接收到accept事件的請(qǐng)求時(shí),把對(duì)應(yīng)的socket封裝到一個(gè)NioSocketChannel中,并交給work線程池,其中work線程池負(fù)責(zé)請(qǐng)求的read和write事件(通過(guò)口述加畫(huà)圖的方式,把請(qǐng)求的執(zhí)行過(guò)程大概描述了一遍,時(shí)間有限,也不可能把所有的細(xì)節(jié)都說(shuō)完,挑重點(diǎn)講,挑記憶深刻的講)
面試官:嗯,理解的還挺深入的…那你在做這個(gè)項(xiàng)目時(shí)有沒(méi)有遇到什么困難,或者是覺(jué)得有挑戰(zhàn)的地方?
我:(這時(shí)面試官想讓你自己出題自己回答了,所以一定要回答,不回答就突顯不出你這個(gè)項(xiàng)目了,要是這個(gè)問(wèn)題沒(méi)有準(zhǔn)備過(guò),只能臨時(shí)發(fā)揮了,當(dāng)然我就是屬于臨時(shí)發(fā)揮的)稍微想一下,因?yàn)橹按_實(shí)碰到了這個(gè)問(wèn)題,當(dāng)時(shí)做這個(gè)項(xiàng)目時(shí),對(duì)netty的不過(guò)熟悉,把請(qǐng)求的業(yè)務(wù)邏輯放在work線程池的線程中進(jìn)行處理,進(jìn)行壓測(cè)的時(shí)候,發(fā)現(xiàn)qps總是上不去,后來(lái)看了源碼之后才發(fā)現(xiàn),由于業(yè)務(wù)邏輯的處理比較耗時(shí),完全占用了work線程池的資源,導(dǎo)致新的請(qǐng)求一直處于等待狀態(tài)。
面試官:那最后是如何解決的?
我:最后把處理業(yè)務(wù)的邏輯封裝成一個(gè)task提交給一個(gè)新建的業(yè)務(wù)線程池中執(zhí)行,執(zhí)行完之后由work線程池執(zhí)行請(qǐng)求的write事件。
面試官:好的,你知道nio中selector可能觸發(fā)bug么?
我:嗯,對(duì)的,selector的select方法,因?yàn)榈讓拥膃poll函數(shù)可能會(huì)發(fā)生空轉(zhuǎn),從而導(dǎo)致cpu100%。
面試官:那如何解決該問(wèn)題?
我:這個(gè)問(wèn)題在netty已經(jīng)解決了,通過(guò)&^%&$^(把netty的解決方案說(shuō)一遍)
面試官:嗯,對(duì)了,你們這個(gè)項(xiàng)目有給自己定指標(biāo)么?
我:有的,&&…………¥¥##@,把自己項(xiàng)目的指標(biāo)說(shuō)了一通,如何進(jìn)行AB實(shí)驗(yàn),如何迭代優(yōu)化指標(biāo)
面試官:嗯,好的 ,項(xiàng)目的問(wèn)題先到這里,我們來(lái)考察一下java的基本點(diǎn)吧。
如上只是本人所做的一個(gè)項(xiàng)目,當(dāng)然了,具體項(xiàng)目具體分析,也不是每個(gè)面試官問(wèn)的點(diǎn)都一樣,如果面試官不懂netty,自然會(huì)挑別的問(wèn)題進(jìn)行提問(wèn),不過(guò)你也可以嘗試著把問(wèn)題往自己熟悉的方向去靠。
2面試知識(shí)點(diǎn)
1、線程池
線程池的實(shí)現(xiàn)原理,這個(gè)知識(shí)點(diǎn)真的很重要,幾乎每次面試都會(huì)被問(wèn)到,一般的提問(wèn)方式有如下幾種:
1、“講講線程池的實(shí)現(xiàn)原理”
2、“線程池中的coreNum和maxNum有什么不同”
3、“在不同的業(yè)務(wù)場(chǎng)景中,線程池參數(shù)如何設(shè)置”
場(chǎng)景對(duì)話:
面試官:平時(shí)線程池用的多么?
我:嗯,我的*項(xiàng)目中就用到了
面試官:那好,你講講線程池的實(shí)現(xiàn)原理
我:(還好我之前看過(guò)源碼,但是時(shí)間久遠(yuǎn)有點(diǎn)模糊了),能給我筆和紙么,我畫(huà)圖分析給你看看,&&¥&假設(shè)初始化一個(gè)線程池,核心線程數(shù)是5,最大線程數(shù)是10@@@
面試官:嗯,好的,你繼續(xù)…
我:在紙上畫(huà)了正方形,這個(gè)代表一個(gè)線程池,初始化的時(shí)候,里面是沒(méi)有線程的
面試官:嗯,好的,你繼續(xù)…
我:又畫(huà)了一個(gè)細(xì)長(zhǎng)的長(zhǎng)方形,這個(gè)代表阻塞隊(duì)列,一開(kāi)始里面也是沒(méi)有任務(wù)的
面試官:嗯,好的,你繼續(xù)…
我:當(dāng)來(lái)了一個(gè)任務(wù)時(shí),在正方形中畫(huà)了一個(gè)小圓圈,代表初始化了一個(gè)線程,如果再來(lái)一個(gè)任務(wù),就再畫(huà)一個(gè)圓圈,表示再初始化了一個(gè)線程,連續(xù)畫(huà)了5個(gè)圓圈之后,如果第6個(gè)任務(wù)過(guò)來(lái)了…
面試官:嗯,好的,你繼續(xù)…
我:這時(shí)會(huì)把第6個(gè)任務(wù)放到阻塞隊(duì)列中..
面試官:嗯,然后呢?
我:現(xiàn)在線程池中不是有5個(gè)線程了么,如果其中一個(gè)線程空閑了,就會(huì)從阻塞隊(duì)列中獲取第6個(gè)任務(wù),進(jìn)行執(zhí)行..
面試官:嗯,對(duì)的,那如果任務(wù)產(chǎn)生的速度比消費(fèi)的速度快呢?
我:如果線程池的5個(gè)線程都在running狀態(tài),那么任務(wù)就先保存在阻塞隊(duì)列中
面試官:如果隊(duì)列滿了,怎么辦?
我:如果隊(duì)列滿了,我們不是設(shè)置了最大線程數(shù)是10么,而線程池中只有5個(gè)線程,這時(shí)會(huì)新建一個(gè)線程去執(zhí)行不能保存到阻塞隊(duì)列的任務(wù),然后我又在正方形中畫(huà)了5個(gè)圓圈。
面試官:那如果線程池中的線程數(shù)達(dá)到10個(gè)了,阻塞隊(duì)列也滿了,怎么辦?
我:這種情況通過(guò)自定義reject函數(shù)去處理這里任務(wù)了,舒了一口去,以為問(wèn)完了…
面試官:好的,那如果運(yùn)行一段時(shí)間之后,阻塞隊(duì)列中的任務(wù)也執(zhí)行完了,線程池中的線程會(huì)怎么樣?
我:…這個(gè)好像超過(guò)核心線程數(shù)的線程會(huì)在空閑一段時(shí)間內(nèi)自動(dòng)回收…因?yàn)橛悬c(diǎn)不記得這個(gè)邏輯了,回答的有點(diǎn)虛…
面試官:好的,那這種情況在什么場(chǎng)景下會(huì)發(fā)生?
我:(有時(shí)候真是笨啊,很多東西都知道,但是在面試的時(shí)候一緊張,全忘記)這個(gè)…那個(gè)…我好像沒(méi)有遇到過(guò)這樣的情況
填寫(xiě)下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)java課程!害怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國(guó)推薦就業(yè)!
面試官:嗯,好的,你回去之后再好好想想
我:……..
我居然忘記了秒殺這個(gè)場(chǎng)景
線程池分析的文章:
http://www.jianshu.com/p/87bff5cc8d8c
2、鎖的實(shí)現(xiàn)
在關(guān)于鎖的面試過(guò)程中,一般主要問(wèn)Synchronized和ReentrantLock的實(shí)現(xiàn)原理,更有甚者會(huì)問(wèn)讀寫(xiě)鎖。
場(chǎng)景對(duì)話:
面試官:都了解Java中的什么鎖?
我:比如Synchronized和ReentrantLock…讀寫(xiě)鎖用的不多,就沒(méi)研究了(我就怕被問(wèn)讀寫(xiě)鎖,因?yàn)橐恢睕](méi)去看)
面試官:那好,你先說(shuō)說(shuō)Synchronized的實(shí)現(xiàn)原理吧
我:嗯,Synchronized是JVM實(shí)現(xiàn)的一種鎖,其中鎖的獲取和釋放分別是monitorenter和monitorexit指令,該鎖在實(shí)現(xiàn)上分為了偏向鎖、輕量級(jí)鎖和重量級(jí)鎖,其中偏向鎖在1.6是默認(rèn)開(kāi)啟的,輕量級(jí)鎖在多線程競(jìng)爭(zhēng)的情況下會(huì)膨脹成重量級(jí)鎖,有關(guān)鎖的數(shù)據(jù)都保存在對(duì)象頭中…&&@@#,(嗯,說(shuō)了一大堆,面試官也沒(méi)打斷我)
面試官:哦,嗯,理解的還挺透徹,那你說(shuō)說(shuō)ReentrantLock的實(shí)現(xiàn)吧…
我:ReentrantLock是基于AQS實(shí)現(xiàn)的
面試官:什么是AQS?
我:在AQS內(nèi)部會(huì)保存一個(gè)狀態(tài)變量state,通過(guò)CAS修改該變量的值,修改成功的線程表示獲取到該鎖,沒(méi)有修改成功,或者發(fā)現(xiàn)狀態(tài)state已經(jīng)是加鎖狀態(tài),則通過(guò)一個(gè)Waiter對(duì)象封裝線程,添加到等待隊(duì)列中,并掛起等待被喚醒&&&$$(又說(shuō)了一堆)
面試官:能說(shuō)說(shuō)CAS的實(shí)現(xiàn)原理么?
我:CAS是通過(guò)unsafe類的compareAndSwap方法實(shí)現(xiàn)的(心里得意的一笑)
面試官:哦,好的,那你知道這個(gè)方法的參數(shù)的含義的么?
我:(這是在逼我啊…努力的回想,因?yàn)槲艺娴目催^(guò)啊)我想想啊,這個(gè)方法看的時(shí)間有點(diǎn)久遠(yuǎn)了,第一個(gè)參數(shù)是要修改的對(duì)象,第二個(gè)參數(shù)是對(duì)象中要修改變量的偏移量,第三個(gè)參數(shù)是修改之前的值,第四個(gè)參數(shù)是預(yù)想修改后的值….(說(shuō)出來(lái)之后都有點(diǎn)佩服自己,這個(gè)都記得,不過(guò)面試官好像還是不肯放過(guò)我…)
面試官:嗯,對(duì)的,那你知道操作系統(tǒng)級(jí)別是如何實(shí)現(xiàn)的么?
我:(我去你大爺…)我只記得X86中有一個(gè)cmp開(kāi)頭的指令,具體的我忘記了…
面試官:嗯,好,你知道CAS指令有什么缺點(diǎn)么
我:哦,CAS的缺點(diǎn)是存在ABA問(wèn)題
面試官:怎么講?
我:就是一個(gè)變量V,如果變量V初次讀取的時(shí)候是A,并且在準(zhǔn)備賦值的時(shí)候檢查到它仍然是A,那能說(shuō)明它的值沒(méi)有被其他線程修改過(guò)了嗎?如果在這段期間它的值曾經(jīng)被改成了B,然后又改回A,那CAS操作就會(huì)誤認(rèn)為它從來(lái)沒(méi)有被修改過(guò)。
面試官:那怎么解決?
我:(有完沒(méi)完了啊…我的心里是崩潰的)針對(duì)這種情況,java并發(fā)包中提供了一個(gè)帶有標(biāo)記的原子引用類”AtomicStampedReference”,它可以通過(guò)控制變量值的版本來(lái)保證CAS的正確性。
面試官:嗯,好的,這個(gè)問(wèn)題到此為止,我們?cè)倏纯磩e的
我:….我能喝口水么
關(guān)于鎖分析的文章,希望對(duì)大家有用:
深入淺出java同步器AQS
http://www.jianshu.com/p/d8eeb31bee5c
java中的CAS
http://www.jianshu.com/p/fb6e91b013cc
深入淺出synchronized
http://www.jianshu.com/p/19f861ab749e
深入淺出ReentrantLock
http://www.jianshu.com/p/4358b1466ec9
java中的Unsafe
http://www.jianshu.com/p/a16d638bc921
java volatile關(guān)鍵字解惑
http://www.jianshu.com/p/195ae7c77afe
深入分析Object.wait/notify實(shí)現(xiàn)機(jī)制
http://www.jianshu.com/p/f4454164c017
深入分析synchronized的JVM實(shí)現(xiàn)
http://www.jianshu.com/p/c5058b6fe8e5
3、ConcurrentHashMap
當(dāng)考察數(shù)據(jù)結(jié)構(gòu)時(shí),面試官一開(kāi)始會(huì)問(wèn)HashMap的實(shí)現(xiàn)原理,當(dāng)你說(shuō)出HashMap并非線程安全之后,會(huì)讓你自己引出ConcurrentHashMap,接著就可能開(kāi)始如下的對(duì)話。
場(chǎng)景對(duì)話:
面試官:談?wù)凜oncurrentHashMap實(shí)現(xiàn)原理
我:@#¥@@基于分段鎖的%%¥#@#¥,但是1.8之后改變實(shí)現(xiàn)方式了
面試官:1.8啥方式
我:把1.8的實(shí)現(xiàn)原理說(shuō)了一通,其中提到了紅黑樹(shù)…
面試官:能講下紅黑樹(shù)的概念嗎
我:紅黑樹(shù)是一種二叉樹(shù),并且是平衡……%……¥……,
面試官:能講下紅黑樹(shù)的。。。。。
我:打住,別問(wèn)了,紅黑樹(shù)我只知道他是二叉樹(shù),比其他樹(shù)多一個(gè)屬性,其他的我都不知道。
面試官:好的,那換個(gè),你知道它的size方法是如何實(shí)現(xiàn)的么?
我:size方法?是想要得到Map中的元素個(gè)數(shù)么?
面試官:對(duì)的….
我:我記得好像size方法返回是不準(zhǔn)確的,平時(shí)也不會(huì)用到這個(gè)方法…
面試官:如果你覺(jué)得size方法返回值不準(zhǔn)確,那如果讓你自己實(shí)現(xiàn),你覺(jué)得應(yīng)該怎么實(shí)現(xiàn)呢?
我:…@#¥@@…兩眼一黑
我:等等,讓我想想…..應(yīng)該可以用AtomicInteger變量進(jìn)行記錄…嗯,對(duì)的,每次插入或刪除的時(shí)候,操作這個(gè)變量,我得意的一笑…
面試官:哦,是么,那如果我覺(jué)得這個(gè)AtomicInteger這個(gè)變量性能不好,還能再優(yōu)化么?
我:懵逼臉…(當(dāng)時(shí)居然把volitile變量給忘記了)…好像沒(méi)有了,我想不出來(lái)了…
面試官:哦,那回頭你再看看源碼吧,jdk中已經(jīng)實(shí)現(xiàn)了…
我:哦,是么….
面試官:那今天的面試到此結(jié)束,我們后面會(huì)通知你。
我:………………
上一篇:哪一個(gè)List實(shí)現(xiàn)了快插入?
下一篇: 沒(méi)有了
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊(cè)會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評(píng)估師國(guó)際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測(cè)工程師建筑八大員注冊(cè)建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評(píng)價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營(yíng)養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論