溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JAVA多線程常問的面試題有哪些

發(fā)布時(shí)間:2021-12-03 14:21:47 來源:億速云 閱讀:152 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“JAVA多線程常問的面試題有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JAVA多線程常問的面試題有哪些”吧!

Java中synchronized 和 ReentrantLock 有什么不同?

Java在過去很長(zhǎng)一段時(shí)間只能通過synchronized關(guān)鍵字來實(shí)現(xiàn)互斥,它有一些缺點(diǎn)。比如你不能擴(kuò)展鎖之外的方法或者塊邊界,嘗試獲取鎖時(shí)不能中途取消等。Java 5 通過Lock接口提供了更復(fù)雜的控制來解決這些問題。 ReentrantLock 類實(shí)現(xiàn)了 Lock,它擁有與 synchronized 相同的并發(fā)性和內(nèi)存語義且它還具有可擴(kuò)展性。

有三個(gè)線程T1,T2,T3,怎么確保它們按順序執(zhí)行?

在多線程中有多種方法讓線程按特定順序執(zhí)行,你可以用線程類的join()方法在一個(gè)線程中啟動(dòng)另一個(gè)線程,另外一個(gè)線程完成該線程繼續(xù)執(zhí)行。為了確保三個(gè)線程的順序你應(yīng)該先啟動(dòng)最后一個(gè)(T3調(diào)用T2,T2調(diào)用T1),這樣T1就會(huì)先完成而T3最后完成。

Thread類中的yield方法有什么作用?

Yield方法可以暫停當(dāng)前正在執(zhí)行的線程對(duì)象,讓其它有相同優(yōu)先級(jí)的線程執(zhí)行。它是一個(gè)靜態(tài)方法而且只保證當(dāng)前線程放棄CPU占用而不能保證使其它線程一定能占用CPU,執(zhí)行yield()的線程有可能在進(jìn)入到暫停狀態(tài)后馬上又被執(zhí)行。

Java中ConcurrentHashMap的并發(fā)度是什么?

ConcurrentHashMap把實(shí)際map劃分成若干部分來實(shí)現(xiàn)它的可擴(kuò)展性和線程安全。這種劃分是使用并發(fā)度獲得的,它是ConcurrentHashMap類構(gòu)造函數(shù)的一個(gè)可選參數(shù),默認(rèn)值為16,這樣在多線程情況下就能避免爭(zhēng)用。

Java線程池中submit() 和 execute()方法有什么區(qū)別?

兩個(gè)方法都可以向線程池提交任務(wù),execute()方法的返回類型是void,它定義在Executor接口中, 而submit()方法可以返回持有計(jì)算結(jié)果的Future對(duì)象,它定義在ExecutorService接口中,它擴(kuò)展了Executor接口,其它線程池類像ThreadPoolExecutor和ScheduledThreadPoolExecutor都有這些方法。

什么是阻塞式方法?

阻塞式方法是指程序會(huì)一直等待該方法完成期間不做其他事情,ServerSocket的accept()方法就是一直等待客戶端連接。這里的阻塞是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起,直到得到結(jié)果之后才會(huì)返回。此外,還有異步和非阻塞式方法在任務(wù)完成前就返回。

Java中的ReadWriteLock是什么?

一般而言,讀寫鎖是用來提升并發(fā)程序性能的鎖分離技術(shù)的成果。Java中的ReadWriteLock是Java 5 中新增的一個(gè)接口,一個(gè)ReadWriteLock維護(hù)一對(duì)關(guān)聯(lián)的鎖,一個(gè)用于只讀操作一個(gè)用于寫。在沒有寫線程的情況下一個(gè)讀鎖可能會(huì)同時(shí)被多個(gè)讀線程持有。寫鎖是獨(dú)占的,你可以使用JDK中的ReentrantReadWriteLock來實(shí)現(xiàn)這個(gè)規(guī)則,它最多支持65535個(gè)寫鎖和65535個(gè)讀鎖。

多線程中的忙循環(huán)是什么?

忙循環(huán)就是程序員用循環(huán)讓一個(gè)線程等待,不像傳統(tǒng)方法wait(), sleep() 或 yield() 它們都放棄了CPU控制,而忙循環(huán)不會(huì)放棄CPU,它就是在運(yùn)行一個(gè)空循環(huán)。這么做的目的是為了保留CPU緩存,在多核系統(tǒng)中,一個(gè)等待線程醒來的時(shí)候可能會(huì)在另一個(gè)內(nèi)核運(yùn)行,這樣會(huì)重建緩存。為了避免重建緩存和減少等待重建的時(shí)間就可以使用它了。

volatile 變量和 atomic 變量有什么不同?

首先,volatile 變量和 atomic 變量看起來很像,但功能卻不一樣。Volatile變量可以確保先行關(guān)系,即寫操作會(huì)發(fā)生在后續(xù)的讀操作之前, 但它并不能保證原子性。例如用volatile修飾count變量那么 count++ 操作就不是原子性的。而AtomicInteger類提供的atomic方法可以讓這種操作具有原子性如getAndIncrement()方法會(huì)原子性的進(jìn)行增量操作把當(dāng)前值加一,其它數(shù)據(jù)類型和引用變量也可以進(jìn)行相似操作。

寫出3條你遵循的多線程最佳實(shí)踐

以下三條最佳實(shí)踐我覺得大多數(shù)Java程序員都應(yīng)該遵循:

  • 給你的線程起個(gè)有意義的名字。

這樣可以方便找bug或追蹤。OrderProcessor, QuoteProcessor or TradeProcessor 這種名字比 Thread-1. Thread-2 and Thread-3 好多了,給線程起一個(gè)和它要完成的任務(wù)相關(guān)的名字,所有的主要框架甚至JDK都遵循這個(gè)最佳實(shí)踐。

  • 避免鎖定和縮小同步的范圍

鎖花費(fèi)的代價(jià)高昂且上下文切換更耗費(fèi)時(shí)間空間,試試最低限度的使用同步和鎖,縮小臨界區(qū)。因此相對(duì)于同步方法我更喜歡同步塊,它給我擁有對(duì)鎖的絕對(duì)控制權(quán)。

  • 多用同步類少用wait 和 notify

首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 這些同步類簡(jiǎn)化了編碼操作,而用wait和notify很難實(shí)現(xiàn)對(duì)復(fù)雜控制流的控制。其次,這些類是由最好的企業(yè)編寫和維護(hù)在后續(xù)的JDK中它們還會(huì)不斷優(yōu)化和完善,使用這些更高等級(jí)的同步工具你的程序可以不費(fèi)吹灰之力獲得優(yōu)化。

  • 多用并發(fā)集合少用同步集合

這是另外一個(gè)容易遵循且受益巨大的最佳實(shí)踐,并發(fā)集合比同步集合的可擴(kuò)展性更好,所以在并發(fā)編程時(shí)使用并發(fā)集合效果更好。如果下一次你需要用到map,你應(yīng)該首先想到用ConcurrentHashMap。

如何強(qiáng)制啟動(dòng)一個(gè)線程?

在Java里面沒有辦法強(qiáng)制啟動(dòng)一個(gè)線程,它是被線程調(diào)度器控制著且Java沒有公布相關(guān)的API。

Java中的fork join框架是什么?

fork join框架是JDK7中出現(xiàn)的一款高效的工具,Java開發(fā)人員可以通過它充分利用現(xiàn)代服務(wù)器上的多處理器。它是專門為了那些可以遞歸劃分成許多子模塊設(shè)計(jì)的,目的是將所有可用的處理能力用來提升程序的性能。fork join框架一個(gè)巨大的優(yōu)勢(shì)是它使用了工作竊取算法,可以完成更多任務(wù)的工作線程可以從其它線程中竊取任務(wù)來執(zhí)行。

感謝各位的閱讀,以上就是“JAVA多線程常問的面試題有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)JAVA多線程常問的面試題有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI