在任何Java面試當(dāng)中多線程和并發(fā)方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位批什,那么你應(yīng)該準備很多關(guān)于多線程的問題农曲。在投資銀行業(yè)務(wù)中多線程和并發(fā)是一個非常受歡迎的話題,特別是電子交易發(fā)展方面相關(guān)的驻债。他們會問面試者很多令人混淆的Java線程問題乳规。面試官只是想確信面試者有足夠的Java線程與并發(fā)方面的知識,因為候選人中有很多只浮于表面合呐。
1. 現(xiàn)在有T1驯妄、T2、T3三個線程合砂,你怎樣保證T2在T1執(zhí)行完后執(zhí)行青扔,T3在T2執(zhí)行完后執(zhí)行源织?
這個線程問題通常會在第一輪或電話面試階段被問到,目的是檢測你對”join”方法是否熟悉微猖。這個多線程問題比較簡單谈息,可以用join方法實現(xiàn)。
2. 在Java中Lock接口比synchronized塊的優(yōu)勢是什么凛剥?你需要實現(xiàn)一個高效的緩存侠仇,它允許多個用戶讀,但只允許一個用戶寫犁珠,以此來保持它的完整性逻炊,你會怎樣去實現(xiàn)它?
lock接口在多線程和并發(fā)編程中最大的優(yōu)勢是它們?yōu)樽x和寫分別提供了鎖犁享,它能滿足你寫像ConcurrentHashMap這樣的高性能數(shù)據(jù)結(jié)構(gòu)和有條件的阻塞余素。Java線程面試的問題越來越會根據(jù)面試者的回答來提問。我強烈建議在你去參加多線程的面試之前認真讀一下Locks炊昆,因為當(dāng)前其大量用于構(gòu)建電子交易終統(tǒng)的客戶端緩存和交易連接空間桨吊。
3. 在java中wait和sleep方法的不同?
通常會在電話面試中經(jīng)常被問到的Java線程面試問題凤巨。最大的不同是在等待時wait會釋放鎖视乐,而sleep一直持有鎖。Wait通常被用于線程間交互敢茁,sleep通常被用于暫停執(zhí)行佑淀。
4. 用Java實現(xiàn)阻塞隊列。
這是一個相對艱難的多線程面試問題彰檬,它能達到很多的目的伸刃。第一,它可以檢測侯選者是否能實際的用Java線程寫程序僧叉;第二奕枝,可以檢測侯選者對并發(fā)場景的理解棺榔,并且你可以根據(jù)這個問很多問題瓶堕。如果他用wait()和notify()方法來實現(xiàn)阻塞隊列,你可以要求他用最新的Java 5中的并發(fā)類來再寫一次症歇。
5. 用Java寫代碼來解決生產(chǎn)者——消費者問題郎笆。
與上面的問題很類似,但這個問題更經(jīng)典忘晤,有些時候面試都會問下面的問題宛蚓。在Java中怎么解決生產(chǎn)者——消費者問題,當(dāng)然有很多解決方法设塔,我已經(jīng)分享了一種用阻塞隊列實現(xiàn)的方法凄吏。有些時候他們甚至?xí)栐趺磳崿F(xiàn)哲學(xué)家進餐問題。
6. 用Java編程一個會導(dǎo)致死鎖的程序,你將怎么解決痕钢?
這是我最喜歡的Java線程面試問題图柏,因為即使死鎖問題在寫多線程并發(fā)程序時非常普遍,但是很多侯選者并不能寫deadlock free code(無死鎖代碼任连?)蚤吹,他們很掙扎。只要告訴他們随抠,你有N個資源和N個線程裁着,并且你需要所有的資源來完成一個操作。為了簡單這里的n可以替換為2拱她,越大的數(shù)據(jù)會使問題看起來更復(fù)雜二驰。通過避免Java中的死鎖來得到關(guān)于死鎖的更多信息。
7. 什么是原子操作椭懊,Java中的原子操作是什么诸蚕?
非常簡單的java線程面試問題,接下來的問題是你需要同步一個原子操作氧猬。
8.?Java中的Volatile關(guān)鍵是什么作用背犯?怎樣使用它?在Java中它跟synchronized方法有什么不同盅抚?
自從Java 5和Java內(nèi)存模型改變以后漠魏,基于volatile關(guān)鍵字的線程問題越來越流行。應(yīng)該準備好回答關(guān)于volatile變量怎樣在并發(fā)環(huán)境中確蓖可見性柱锹、順序性和一致性。
9. 什么是競爭條件丰包?你怎樣發(fā)現(xiàn)和解決競爭禁熏?
這是一道出現(xiàn)在多線程面試的高級階段的問題。大多數(shù)的面試官會問最近你遇到的競爭條件邑彪,以及你是怎么解決的瞧毙。有些時間他們會寫簡單的代碼,然后讓你檢測出代碼的競爭條件寄症≈姹耄可以參考我之前發(fā)布的關(guān)于Java競爭條件的文章。在我看來這是最好的java線程面試問題之一有巧,它可以確切的檢測候選者解決競爭條件的經(jīng)驗释漆,or?writing code which is free of data race or any other?race condition。關(guān)于這方面最好的書是《Concurrency practices in Java》篮迎。
10. 你將如何使用thread dump男图?你將如何分析Thread dump示姿?
在UNIX中你可以使用kill -3,然后thread dump將會打印日志逊笆,在windows中你可以使用”CTRL+Break”峻凫。非常簡單和專業(yè)的線程面試問題,但是如果他問你怎樣分析它览露,就會很棘手荧琼。
11. 為什么我們調(diào)用start()方法時會執(zhí)行run()方法,為什么我們不能直接調(diào)用run()方法差牛?
這是另一個非常經(jīng)典的java多線程面試問題命锄。這也是我剛開始寫線程程序時候的困惑。現(xiàn)在這個問題通常在電話面試或者是在初中級Java面試的第一輪被問到偏化。這個問題的回答應(yīng)該是這樣的脐恩,當(dāng)你調(diào)用start()方法時你將創(chuàng)建新的線程,并且執(zhí)行在run()方法里的代碼侦讨。但是如果你直接調(diào)用run()方法驶冒,它不會創(chuàng)建新的線程也不會執(zhí)行調(diào)用線程的代碼。閱讀我之前寫的《start與run方法的區(qū)別》這篇文章來獲得更多信息韵卤。
12. Java中你怎樣喚醒一個阻塞的線程骗污?
這是個關(guān)于線程和阻塞的棘手的問題,它有很多解決方法沈条。如果線程遇到了IO阻塞需忿,我并且不認為有一種方法可以中止線程。如果線程因為調(diào)用wait()蜡歹、sleep()屋厘、或者join()方法而導(dǎo)致的阻塞,你可以中斷線程月而,并且通過拋出InterruptedException來喚醒它汗洒。我之前寫的《How to deal with blocking methods in java》有很多關(guān)于處理線程阻塞的信息。
13. 在Java中CycliBarriar和CountdownLatch有什么區(qū)別父款?
這個線程問題主要用來檢測你是否熟悉JDK5中的并發(fā)包溢谤。這兩個的區(qū)別是CyclicBarrier可以重復(fù)使用已經(jīng)通過的障礙,而CountdownLatch不能重復(fù)使用铛漓。
14. 什么是不可變對象溯香,它對寫并發(fā)應(yīng)用有什么幫助鲫构?
另一個多線程經(jīng)典面試問題浓恶,并不直接跟線程有關(guān),但間接幫助很多结笨。這個java面試問題可以變的非常棘手包晰,如果他要求你寫一個不可變對象湿镀,或者問你為什么String是不可變的。
15. 你在多線程環(huán)境中遇到的共同的問題是什么伐憾?你是怎么解決它的勉痴?
多線程和并發(fā)程序中常遇到的有Memory-interface、競爭條件树肃、死鎖蒸矛、活鎖和饑餓。問題是沒有止境的胸嘴,如果你弄錯了雏掠,將很難發(fā)現(xiàn)和調(diào)試。這是大多數(shù)基于面試的劣像,而不是基于實際應(yīng)用的Java線程問題乡话。
補充的其它幾個問題:
1)在java中綠色線程和本地線程區(qū)別?
2)線程與進程的區(qū)別耳奕?
3)什么是多線程中的上下文切換绑青?
4)死鎖與活鎖的區(qū)別,死鎖與餡餅的區(qū)別屋群?
5)Java中用到的線程調(diào)度算法是什么闸婴?
6)在Java中什么是線程調(diào)度?
7)在線程中你怎么處理不可捕捉異常芍躏?
8)什么是線程組掠拳,為什么在Java中不推薦使用?
9)為什么使用Executor框架比使用應(yīng)用創(chuàng)建和管理線程好纸肉?
10)在Java中Executor和Executors的區(qū)別溺欧?
11)如何在Windows和Linux上查找哪個線程使用的CPU時間最長?
在此我向大家推薦一個架構(gòu)學(xué)習(xí)交流群柏肪。交流學(xué)習(xí)群號:478030634 里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring姐刁,MyBatis,Netty源碼分析烦味,高并發(fā)聂使、高性能、分布式谬俄、微服務(wù)架構(gòu)的原理柏靶,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系溃论。還能領(lǐng)取免費的學(xué)習(xí)資源屎蜓,目前受益良多
注:關(guān)注作者微信公眾號,了解更多分布式架構(gòu)钥勋、微服務(wù)炬转、netty辆苔、MySQL、spring扼劈、性能優(yōu)化驻啤、等知識點。公眾號:《Java爛豬皮》