多線程并發(fā)編程是Java編程中重要的一塊內(nèi)容,也是面試重點(diǎn)覆蓋區(qū)域。所以,學(xué)好多線程并發(fā)編程對Java程序員來說極其重要的。下面北大青鳥長沙麓谷校區(qū)java學(xué)院小編整理了60道最常見的Java多線程面試題及答案,供你學(xué)習(xí)或者面試參考。
1.多線程使用的優(yōu)缺點(diǎn)?
優(yōu)點(diǎn):
(1)多線程技術(shù)使程序的響應(yīng)速度更快
(2)當(dāng)前沒有進(jìn)行處理的任務(wù)可以將處理器時間讓給其它任務(wù)
(3)占用大量處理時間的任務(wù)可以定期將處理器時間讓給其它任務(wù)
(4)可以隨時停止任務(wù)
(5)可以分別設(shè)置各個任務(wù)的優(yōu)先級以及優(yōu)化性能
缺點(diǎn):
(1)等候使用共享資源時造成程序的運(yùn)行速度變慢
(2)對線程進(jìn)行管理要求額外的cpu開銷
(3)可能出現(xiàn)線程死鎖情況。即較長時間的等待或資源競爭以及死鎖等癥狀。
1.start()方法和run()方法簡介和區(qū)別?
start()方法:
1)用start方法來啟動線程,真正實(shí)現(xiàn)了多線程運(yùn)行,這時無需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的代碼。
2)通過調(diào)用Thread類的start()方法來啟動一個線程,這時此線程處于就緒(可運(yùn)行)狀態(tài),并沒有運(yùn)行,一旦得到CPU時間片,就開始執(zhí)行run()方法。
run()方法:
1)run()方法只是類的一個普通方法而已,如果直接調(diào)用Run方法,程序中依然只有主線程這一個線程,其程序執(zhí)行路徑還是只有一條。
總結(jié):
1)調(diào)用start方法方可啟動線程,
2)而run方法只是thread的一個普通方法調(diào)用,還是在主線程里執(zhí)行。
3)把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調(diào)用run()方法,這是由jvm的內(nèi)存機(jī)制規(guī)定的。
4)并且run()方法必須是public訪問權(quán)限,返回值類型為void。
2.Runnable接口和Callable接口的相同點(diǎn)和不同點(diǎn)?
Lock和synchronized對比?
1)Lock是一個接口,而synchronized是Java中的關(guān)鍵字,synchronized是內(nèi)置的語言實(shí)現(xiàn);
2)synchronized在發(fā)生異常時,會自動釋放線程占有的鎖,因此不會導(dǎo)致死鎖現(xiàn)象發(fā)生;而Lock在發(fā)生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現(xiàn)象,因此使用Lock時需要在finally塊中釋放鎖;
3)Lock可以讓等待鎖的線程響應(yīng)中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應(yīng)中斷;
4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
5)Lock可以提高多個線程進(jìn)行讀操作的效率。
6)在JDK1.5中,synchronized是性能低效的。因?yàn)檫@是一個重量級操作,它對性能最大的影響是阻塞式的實(shí)現(xiàn),掛起線程和恢復(fù)線程的操作都需要轉(zhuǎn)入內(nèi)核態(tài)中完成,這些操作給系統(tǒng)的并發(fā)性帶來了很大的壓力。相比之下使用Java提供的Lock對象,性能更高一些。
但是,JDK1.6,發(fā)生了變化,對synchronize加入了很多優(yōu)化措施,有自適應(yīng)自旋,鎖消除,鎖粗化,輕量級鎖,偏向鎖等等。導(dǎo)致在JDK1.6上synchronize的性能并不比Lock差。因此。提倡優(yōu)先考慮使用synchronized來進(jìn)行同步。
更多java面試題請關(guān)注北大青鳥長沙麓谷校區(qū)java學(xué)院官網(wǎng)。