Java程序員面試題集錦
Java面試隨著時(shí)間的改變而改變。在過去的日子里,當(dāng)你知道String和StringBuilder的區(qū)別就能讓你直接進(jìn)入第二輪面試,但是現(xiàn)在問題變得越來越高級(jí),面試官問的問題也更深入。下面是小編整理的關(guān)于Java程序員面試題集錦,希望大家認(rèn)真閱讀!
1)Java中能創(chuàng)建Volatile數(shù)組嗎?
能,Java中可以創(chuàng)建volatile類型數(shù)組,不過只是一個(gè)指向數(shù)組的引用,而不是整個(gè)數(shù)組。我的意思是,如果改變引用指向的數(shù)組,將會(huì)受到volatile的保護(hù),但是如果多個(gè)線程同時(shí)改變數(shù)組的元素,volatile標(biāo)示符就不能起到之前的保護(hù)作用了。
2)volatile能使得一個(gè)非原子操作變成原子操作嗎?
一個(gè)典型的例子是在類中有一個(gè)long類型的成員變量。如果你知道該成員變量會(huì)被多個(gè)線程訪問,如計(jì)數(shù)器、價(jià)格等,你最好是將其設(shè)置為volatile。為什么?因?yàn)镴ava中讀取long類型變量不是原子的,需要分成兩步,如果一個(gè)線程正在修改該long變量的值,另一個(gè)線程可能只能看到該值的一半(前32位)。但是對(duì)一個(gè)volatile型的long或double變量的讀寫是原子。
3)volatile修飾符的有過什么實(shí)踐?
一種實(shí)踐是用volatile修飾long和double變量,使其能按原子類型來讀寫。double和long都是64位寬,因此對(duì)這兩種類型的讀是分為兩部分的,第一次讀取第一個(gè)32位,然后再讀剩下的32位,這個(gè)過程不是原子的,但Java中volatile型的long或double變量的讀寫是原子的。volatile修復(fù)符的另一個(gè)作用是提供內(nèi)存屏障(memorybarrier),例如在分布式框架中的應(yīng)用。簡(jiǎn)單的說,就是當(dāng)你寫一個(gè)volatile變量之前,Java內(nèi)存模型會(huì)插入一個(gè)寫屏障(writebarrier),讀一個(gè)volatile變量之前,會(huì)插入一個(gè)讀屏障(readbarrier)。意思就是說,在你寫一個(gè)volatile域時(shí),能保證任何線程都能看到你寫的值,同時(shí),在寫之前,也能保證任何數(shù)值的更新對(duì)所有線程是可見的,因?yàn)閮?nèi)存屏障會(huì)將其他所有寫的值更新到緩存。
4)volatile類型變量提供什么保證?(答案)
volatile變量提供順序和可見性保證,例如,JVM或者JIT為了獲得更好的性能會(huì)對(duì)語句重排序,但是volatile類型變量即使在沒有同步塊的情況下賦值也不會(huì)與其他語句重排序。volatile提供happens-before的保證,確保一個(gè)線程的修改能對(duì)其他線程是可見的。某些情況下,volatile還能提供原子性,如讀64位數(shù)據(jù)類型,像long和double都不是原子的,但volatile類型的double和long就是原子的。
5)10個(gè)線程和2個(gè)線程的同步代碼,哪個(gè)更容易寫?
從寫代碼的角度來說,兩者的復(fù)雜度是相同的,因?yàn)橥酱a與線程數(shù)量是相互獨(dú)立的。但是同步策略的選擇依賴于線程的數(shù)量,因?yàn)樵蕉嗟木程意味著更大的競(jìng)爭(zhēng),所以你需要利用同步技術(shù),如鎖分離,這要求更復(fù)雜的代碼和專業(yè)知識(shí)。
6)你是如何調(diào)用wait()方法的?使用if塊還是循環(huán)?為什么?(答案)
wait()方法應(yīng)該在循環(huán)調(diào)用,因?yàn)楫?dāng)線程獲取到CPU開始執(zhí)行的時(shí)候,其他條件可能還沒有滿足,所以在處理前,循環(huán)檢測(cè)條件是否滿足會(huì)更好。下面是一段標(biāo)準(zhǔn)的使用wait和notify方法的代碼://Thestandardidiomforusingthewaitmethod
參見EffectiveJava第69條,獲取更多關(guān)于為什么應(yīng)該在循環(huán)中來調(diào)用wait方法的內(nèi)容。
7)Java中應(yīng)該使用什么數(shù)據(jù)類型來代表價(jià)格?(答案)
如果不是特別關(guān)心內(nèi)存和性能的話,使用BigDecimal,否則使用預(yù)定義精度的double類型。
8)什么是Busyspin?我們?yōu)槭裁匆褂盟?
Busyspin是一種在不釋放CPU的基礎(chǔ)上等待事件的技術(shù)。它經(jīng)常用于避免丟失CPU緩存中的數(shù)據(jù)(如果線程先暫停,之后在其他CPU上運(yùn)行就會(huì)丟失)。所以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環(huán)檢測(cè)隊(duì)列中的新消息來代替調(diào)用sleep()或wait()方法。它唯一的好處就是你只需等待很短的時(shí)間,如幾微秒或幾納秒。LMAX分布式框架是一個(gè)高性能線程間通信的庫,該庫有一個(gè)BusySpinWaitStrategy類就是基于這個(gè)概念實(shí)現(xiàn)的,使用busyspin循環(huán)EventProcessors等待屏障。
9)Java中怎么獲取一份線程dump文件?
在Linux下,你可以通過命令kill-3PID(Java進(jìn)程的進(jìn)程ID)來獲取Java應(yīng)用的dump文件。在Windows下,你可以按下Ctrl+Break來獲取。這樣JVM就會(huì)將線程的dump文件打印到標(biāo)準(zhǔn)輸出或錯(cuò)誤文件中,它可能打印在控制臺(tái)或者日志文件中,具體位置依賴應(yīng)用的配置。如果你使用Tomcat。
10)Swing是線程安全的?(答案)
不是,Swing不是線程安全的。你不能通過任何線程來更新Swing組件,如JTable、JList或JPanel,事實(shí)上,它們只能通過GUI或AWT線程來更新。這就是為什么Swing提供invokeAndWait()和invokeLater()方法來獲取其他線程的GUI更新請(qǐng)求。這些方法將更新請(qǐng)求放入AWT的線程隊(duì)列中,可以一直等待,也可以通過異步更新直接返回結(jié)果。你也可以在參考答案中查看和學(xué)習(xí)到更詳細(xì)的內(nèi)容。
11)什么是線程局部變量?(答案)
線程局部變量是局限于線程內(nèi)部的變量,屬于線程自身所有,不在多個(gè)線程間共享。Java提供ThreadLocal類來支持線程局部變量,是一種實(shí)現(xiàn)線程安全的方式。但是在管理環(huán)境下(如web服務(wù)器)使用線程局部變量的時(shí)候要特別小心,在這種情況下,工作線程的生命周期比任何應(yīng)用變量的生命周期都要長(zhǎng)。任何線程局部變量一旦在工作完成后沒有釋放,Java應(yīng)用就存在內(nèi)存泄露的風(fēng)險(xiǎn)。
12)用wait-notify寫一段代碼來解決生產(chǎn)者-消費(fèi)者問題?(答案)
請(qǐng)參考答案中的示例代碼。只要記住在同步塊中調(diào)用wait()和notify()方法,如果阻塞,通過循環(huán)來測(cè)試等待條件。
13)用Java寫一個(gè)線程安全的單例模式(Singleton)?(答案)
請(qǐng)參考答案中的示例代碼,這里面一步一步教你創(chuàng)建一個(gè)線程安全的Java單例類。當(dāng)我們說線程安全時(shí),意思是即使初始化是在多線程環(huán)境中,仍然能保證單個(gè)實(shí)例。Java中,使用枚舉作為單例類是最簡(jiǎn)單的方式來創(chuàng)建線程安全單例模式的方式。
14)Java中sleep方法和wait方法的區(qū)別?(答案)
雖然兩者都是用來暫停當(dāng)前運(yùn)行的線程,但是sleep()實(shí)際上只是短暫停頓,因?yàn)樗粫?huì)釋放鎖,而wait()意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@樣,其他等待的線程才能在滿足條件時(shí)獲取到該鎖。
15)什么是不可變對(duì)象(immutableobject)?Java中怎么創(chuàng)建一個(gè)不可變對(duì)象?(答案)
不可變對(duì)象指對(duì)象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會(huì)創(chuàng)建一個(gè)新的對(duì)象,如String、Integer及其它包裝類。詳情參見答案,一步一步指導(dǎo)你在Java中創(chuàng)建一個(gè)不可變的類。
【Java程序員面試題】相關(guān)文章:
java程序員面試題10-05
java初級(jí)程序員面試題「經(jīng)典」09-05
Java程序員面試題及答案07-19
2017年Java程序員面試題集07-24
Java程序員集合框架面試題及答案10-25
2017年Java程序員面試題及答案07-01
java面試題及答案11-01
華為Java面試題精選10-13
java基礎(chǔ)面試題201708-28