更新時(shí)間:2023-02-16 16:15:21 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1747次
Java高并發(fā)面試題是所有程序員在面試過(guò)程中都被百般刁難的題目,只有熟練掌握,才能得心應(yīng)手的應(yīng)對(duì)面試官,才能在眾多面試者中脫穎而出。今天小編針對(duì)高并發(fā)的相關(guān)面試題,為大家總結(jié)出了以下幾個(gè)重點(diǎn)面試題目,希望可以幫助到大家:

1. 什么是原子操作在Java Concurrency API中有哪些原子類(atomic classes)
原子操作是指一個(gè)不受其他操作影響的操作任務(wù)單元。原子操作是在多線程環(huán)境下避免數(shù)據(jù)不一致必須的手段。
int++并不是一個(gè)原子操作,所以當(dāng)一個(gè)線程讀取它的值并加1時(shí),另外一個(gè)線程有可能會(huì)讀到之前的值,這就會(huì)引發(fā)錯(cuò)誤。
為了解決這個(gè)問(wèn)題,必須保證增加操作是原子的,在JDK1.5之前我們可以使用同步技術(shù)來(lái)做到這一點(diǎn)。到JDK1.5,java.util.concurrent.atomic包提供了int和long類型的裝類,它們可以自動(dòng)的保證對(duì)于他們的操作是原子的并且不需要使用同步。
2. Java Concurrency API中的Lock接口(Lock interface)是什么對(duì)比同步它有什么優(yōu)勢(shì)
Lock接口比同步方法和同步塊提供了更具擴(kuò)展性的鎖操作。他們?cè)试S更靈活的結(jié)構(gòu),可以具有完全不同的性質(zhì),并且可以支持多個(gè)相關(guān)類的條件對(duì)象。
它的優(yōu)勢(shì)有:
· 可以使鎖更公平
· 可以使線程在等待鎖的時(shí)候響應(yīng)中斷
· 可以讓線程嘗試獲取鎖,并在無(wú)法獲取鎖的時(shí)候立即返回或者等待一段時(shí)間
· 可以在不同的范圍,以不同的順序獲取和釋放鎖
3. 什么是Executors框架
Executor框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一個(gè)根據(jù)一組執(zhí)行策略調(diào)用,調(diào)度,執(zhí)行和控制的異步任務(wù)的框架。
無(wú)限制的創(chuàng)建線程會(huì)引起應(yīng)用程序內(nèi)存溢出。所以創(chuàng)建一個(gè)線程池是個(gè)更好的的解決方案,因?yàn)榭梢韵拗凭€程的數(shù)量并且可以回收再利用這些線程。利用Executors框架可以非常方便的創(chuàng)建一個(gè)線程池。
4. 什么是阻塞隊(duì)列如何使用阻塞隊(duì)列來(lái)實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型
java.util.concurrent.BlockingQueue的特性是:當(dāng)隊(duì)列是空的時(shí),從隊(duì)列中獲取或刪除元素的操作將會(huì)被阻塞,或者當(dāng)隊(duì)列是滿時(shí),往隊(duì)列里添加元素的操作會(huì)被阻塞。
阻塞隊(duì)列不接受空值,當(dāng)你嘗試向隊(duì)列中添加空值的時(shí)候,它會(huì)拋出NullPointerException。阻塞隊(duì)列的實(shí)現(xiàn)都是線程安全的,所有的查詢方法都是原子的并且使用了內(nèi)部鎖或者其他形式的并發(fā)控制。BlockingQueue 接口是java collections框架的一部分,它主要用于實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問(wèn)題。
5. 什么是Callable和Future
Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一個(gè)對(duì)象或者拋出一個(gè)異常。
Callable接口使用泛型去定義它的返回類型。Executors類提供了一些有用的方法去在線程池中執(zhí)行Callable內(nèi)的任務(wù)。由于Callable任務(wù)是并行的,我們必須等待它返回的結(jié)果。java.util.concurrent.Future對(duì)象為我們解決了這個(gè)問(wèn)題。在線程池提交Callable任務(wù)后返回了一個(gè)Future對(duì)象,使用它我們可以知道Callable任務(wù)的狀態(tài)和得到Callable返回的執(zhí)行結(jié)果。Future提供了get()方法讓我們可以等待Callable結(jié)束并獲取它的執(zhí)行結(jié)果。
6. 什么是FutureTask
FutureTask是Future的一個(gè)基礎(chǔ)實(shí)現(xiàn),我們可以將它同Executors使用處理異步任務(wù)。通常我們不需要使用FutureTask類,單當(dāng)我們打算重寫(xiě)Future接口的一些方法并保持原來(lái)基礎(chǔ)的實(shí)現(xiàn)是,它就變得非常有用。我們可以僅僅繼承于它并重寫(xiě)我們需要的方法。
7.什么是并發(fā)容器的實(shí)現(xiàn)
Java集合類都是快速失敗的,這就意味著當(dāng)集合被改變且一個(gè)線程在使用迭代器遍歷集合的時(shí)候,迭代器的next()方法將拋出ConcurrentModificationException異常。
并發(fā)容器支持并發(fā)的遍歷和并發(fā)的更新。主要的類有ConcurrentHashMap, CopyOnWriteArrayList 和CopyOnWriteArraySet。
8. Executors類是什么
Executors為Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable類提供了一些工具方法。
Executors可以用于方便的創(chuàng)建線程池。
以上就是“容易被刁難的Java高并發(fā)面試題”,你能回答上來(lái)嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)