更新時(shí)間:2020-01-09 16:24:49 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3013次
1)啥是 Busy spin?咱們?yōu)樯兑\(yùn)用它?
Busy spin 是一種在不開(kāi)釋 CPU 的基礎(chǔ)上等候事情的技術(shù)。它常常用于防止丟掉 CPU 緩存中的數(shù)據(jù)(假如線程先暫停,以后在別的CPU上運(yùn)轉(zhuǎn)就會(huì)丟掉)。所以,假如你的作業(yè)要求低推遲,而且你的線程現(xiàn)在沒(méi)有任何次序,這么你就能夠經(jīng)過(guò)循環(huán)檢查行列中的新消息來(lái)替代調(diào)用 sleep() 或 wait() 辦法。它唯一的優(yōu)點(diǎn)即是你只需等候很短的時(shí)刻,如幾微秒或幾納秒。LMAX 分布式框架是一個(gè)高性能線程間通訊的庫(kù),該庫(kù)有一個(gè) BusySpinWaitStrategy 類(lèi)即是根據(jù)這個(gè)概念完成的,運(yùn)用 busy spin 循環(huán) EventProcessors 等候屏障。
2)Java 中怎樣獲取一份線程 dump 文件?
在 Linux 下,你能夠經(jīng)過(guò)指令 kill -3 PID (Java 進(jìn)程的進(jìn)程 ID)來(lái)獲取 Java 運(yùn)用的 dump 文件。在 Windows 下,你能夠按下 Ctrl + Break 來(lái)獲取。這么 JVM 就會(huì)將線程的 dump 文件打印到規(guī)范輸出或過(guò)錯(cuò)文件中,它也許打印在控制臺(tái)或許日志文件中,具體位置依靠運(yùn)用的裝備。假如你運(yùn)用Tomcat。
3)Swing 是線程安全的?
不是,Swing 不是線程安全的。你不能經(jīng)過(guò)任何線程來(lái)更新 Swing 組件,如 JTable、JList 或 JPanel,事實(shí)上,它們只能經(jīng)過(guò) GUI 或 AWT 線程來(lái)更新。這即是為啥 Swing 供給 invokeAndWait() 和 invokeLater() 辦法來(lái)獲取別的線程的 GUI 更新懇求。這些辦法將更新懇求放入 AWT 的線程行列中,能夠一向等候,也能夠經(jīng)過(guò)異步更新直接回來(lái)成果。你也能夠在參考答案中檢查和學(xué)習(xí)到更具體的內(nèi)容。
4)啥是線程局部變量?
線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身一切,不在多個(gè)線程間同享。Java 供給 ThreadLocal 類(lèi)來(lái)支撐線程局部變量,是一種完成線程安全的辦法。可是在辦理環(huán)境下(如 web 服務(wù)器)運(yùn)用線程局部變量的時(shí)分要格外當(dāng)心,在這種情況下,作業(yè)線程的生命周期比任何運(yùn)用變量的生命周期都要長(zhǎng)。任何線程局部變量一旦在作業(yè)完成后沒(méi)有開(kāi)釋?zhuān)琂ava 運(yùn)用就存在內(nèi)存泄露的危險(xiǎn)。
5)用 wait-notify 寫(xiě)一段代碼來(lái)解決生產(chǎn)者-消費(fèi)者疑問(wèn)?
請(qǐng)參考答案中的示例代碼。只需記住在同步塊中調(diào)用 wait() 和 notify()辦法,假如堵塞,經(jīng)過(guò)循環(huán)來(lái)測(cè)驗(yàn)等候條件。
6) 用 Java 寫(xiě)一個(gè)線程安全的單例形式(Singleton)?
請(qǐng)參考答案中的示例代碼,這里面一步一步教你創(chuàng)立一個(gè)線程安全的 Java 單例類(lèi)。當(dāng)咱們說(shuō)線程安全時(shí),意思是即使初始化是在多線程環(huán)境中,依然能保證單個(gè)實(shí)例。Java 中,運(yùn)用枚舉作為單例類(lèi)是最簡(jiǎn)略的辦法來(lái)創(chuàng)立線程安全單例形式的辦法。
7)Java 中 sleep 辦法和 wait 辦法的差異?
盡管兩者都是用來(lái)暫停當(dāng)前運(yùn)轉(zhuǎn)的線程,可是sleep() 實(shí)際上僅僅短暫中止,由于它不會(huì)開(kāi)釋鎖,而 wait() 意味著條件等候,這即是為啥該辦法要開(kāi)釋鎖,由于只要這么,別的等候的線程才能在滿(mǎn)足條件時(shí)獲取到該鎖。
8)啥是不可變目標(biāo)(immutable object)?Java 中怎樣創(chuàng)立一個(gè)不可變目標(biāo)?
不可變目標(biāo)指目標(biāo)一旦被創(chuàng)立,狀況就不能再改動(dòng)。任何修正都會(huì)創(chuàng)立一個(gè)新的目標(biāo),如 String、Integer及其它包裝類(lèi)。概況拜見(jiàn)答案,一步一步指導(dǎo)你在 Java 中創(chuàng)立一個(gè)不可變的類(lèi)。
9)咱們能創(chuàng)立一個(gè)包括可變目標(biāo)的不可變目標(biāo)嗎?
是的,咱們是能夠創(chuàng)立一個(gè)包括可變目標(biāo)的不可變目標(biāo)的,你只需求慎重一點(diǎn),不要同享可變目標(biāo)的引證就能夠了,假如需求變化時(shí),就回來(lái)原目標(biāo)的一個(gè)復(fù)制。最常見(jiàn)的比如即是目標(biāo)中包括一個(gè)日期目標(biāo)的引證。
Java面試總的來(lái)說(shuō)面試無(wú)非要做到兩點(diǎn):
1.別人答不上的,你得知道。
2.別人答得上的,你得知道的更多!包括但不限于Java多線程,鎖,SSM源碼,并發(fā)包,各類(lèi)集合框架,MySQL索引調(diào)優(yōu),事務(wù),MVCC,Redis相關(guān)內(nèi)容,JVM垃圾回收,內(nèi)存模型,類(lèi)加載機(jī)制。
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“唯品會(huì)高級(jí)Java面試題,程序員怎么回答”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743