一個小夥伴最近參加某一線互聯網公司的面試,被問到了一些併發相關的問題,看看大家能否答出來:
(1)synchronized的CPU原語級別是如何實現的?
(2)無鎖、偏向鎖、輕量級鎖、重量級鎖有什麼差別,升級過程如何?
(3)線程間通信,同機器進程間通信,跨機器進程間通信,各有什麼方法?
(4)下列三種業務,應該如何使用線程池:
- 高併發、任務執行時間短的業務
- 併發不高、任務執行時間長的業務
- 併發高、業務執行時間長的業務
(5)秒殺系統,如何能夠撐住100W級別TPS(淘寶最高54萬TPS)?
常見的多線程面試題:
下面這些是我在不同時間不同地點喜歡問的Java線程問題。我沒有提供答案,但只要可能我會給你線索,有些時候這些線索足夠回答問題。
1.現在有T1、T2、T3三個線程,你怎樣保證T2在T1執行完後執行,T3在T2執行完後執行?
這個線程問題通常會在第一輪或電話面試階段被問到,目的是檢測你對”join”方法是否熟悉。這個多線程問題比較簡單,可以用join方法實現。
2.在Java中Lock接口比synchronized塊的優勢是什麼?你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶些,以此來保持它的完整性,你會怎樣去實現它?
lock接口在多線程和併發編程中最大的優勢是它們爲讀和寫分別提供了鎖,它能滿足你寫像ConcurrentHashMap這樣的高性能數據結構和有條件的阻塞。Java線程面試的問題越來越會根據面試者的回答來提問。我強烈建議在你去參加多線程的面試之前認真讀一下Locks,因爲當前其大量用於構建電子交易系統的客戶端緩存和交易連接空間。
3.在java中wait和sleep方法的不同?
通常會在電話面試中經常被問到的Java線程面試問題。最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用於線程間交互,sleep通常被用於暫停執行。
4.用Java寫代碼來解決生產者——消費者問題。
與上面的問題很類似,但這個問題更經典,有些時候面試都會問下面的問題。在Java中怎麼解決生產者——消費者問題,當然有很多解決方法,我已經分享了一種用阻塞隊列實現的方法。有些時候他們甚至會問怎麼實現哲學家進餐問題。
5.你將如何使用thread dump?你將如何分析Thread dump?
在UNIX中你可以使用kill -3,然後thread dump將會打印日誌,在windows中你可以使用”CTRL+Break”。非常簡單和專業的線程面試問題,但是如果他問你怎樣分析它,就會很棘手。
6.用Java編程一個會導致死鎖的程序,你將怎麼解決?
這是我最喜歡的Java線程面試問題,因爲即使死鎖問題在寫多線程併發程序時非常普遍,但是很多候選者並不能寫deadlock free code(無死鎖代碼?),他們很掙扎。只要告訴他們,你有N個資源和N個線程,並且你需要所有的資源來完成一個操作。爲了簡單這裏的n可以替換爲2,越大的數據會使問題看起來更復雜。通過避免Java中的死鎖來得到關於死鎖的更多信息。
7.你在多線程環境中遇到的共同的問題是什麼?你是怎麼解決它的?
多線程和併發程序中常遇到的有Memory-interface、競爭條件、死鎖、活鎖和飢餓。問題是沒有止境的,如果你弄錯了,將很難發現和調試。這是大多數基於面試的,而不是基於實際應用的Java線程問題。
8.爲什麼我們調用start()方法時會執行run()方法,爲什麼我們不能直接調用run()方法?
這是一個非常經典的java多線程面試問題。這也是我剛開始寫線程程序時候的困惑。現在這個問題通常在電話面試或者是在初中級Java面試的第一輪被問到。這個問題的回答應該是這樣的,當你調用start()方法時你將創建新的線程,並且執行在run()方法裏的代碼。但是如果你直接調用run()方法,它不會創建新的線程也不會執行調用線程的代碼。
9.Java中的volatile關鍵是什麼作用?怎樣使用它?在Java中它跟synchronized方法有什麼不同?
自從Java 5和Java內存模型改變以後,基於volatile關鍵字的線程問題越來越流行。應該準備好回答關於volatile變量怎樣在併發環境中確保可見性、順序性和一致性。
10.什麼是不可變對象,它對寫併發應用有什麼幫助?
另一個多線程經典面試問題,並不直接跟線程有關,但間接幫助很多。這個java面試問題可以變得非常棘手,如果他要求你寫一個不可變對象,或者問你爲什麼String是不可變的。
多線程與高併發學習路線
需要高清大圖的小夥伴只需要關注+轉發,後臺私信”多線程“即可獲取
針對性的瞭解相關的知識
《多線程與高併發》這兩大塊兒是現在面試問的越來越多,也是相對一個初級的程序員向中高級邁進的必須要踏過的一個坎兒。這本書帶你將多線程的知識系統化,幫助你理解多線程在CPU層級的實現,以及這些實現如何一層一層的映射到那些上億用戶,千萬QPS,百萬TPS的系統。
如果平時只有CRUD的經驗
不瞭解多線程與高併發,面對這樣面試題,大概率一頭霧水。
如果真是這樣,建議要拿出4個小時的時間,參加一次馬士兵老師的《多線程與高併發》訓練營
只需2分錢
參加訓練營與學習資料私信小編“高併發”獲取
馬士兵老師
99年清華畢業,從程序員幹到CTO,雖然已經45歲,但寶刀未老,一直致力於推動Java、大數據、AI生根中國,其高併發直播課程廣受歡迎,有千萬次播放學習。
讓骨灰級掃地神僧馬士兵老師帶你將多線程的知識系統化,幫助你理解多線程在CPU層級的實現,以及這些實現如何一層一層的映射到那些上億用戶,千萬QPS,百萬TPS的系統。
課程時間:
6.25~6.26每晚八點
課程價格:
原價299,本號粉絲僅需0.02元。
2分錢,買不了喫虧,買不了上當。
參加訓練營私信小編“高併發”獲取
訓練營第一天:
1、synchronized關鍵字的字節碼原語;
2、volatile關鍵字的字節碼原語;
3、synchronized與volatile的硬件級實現;
4、無鎖、偏向鎖、輕量級鎖、重量級鎖的升級過程;
5、內存屏障的基本概念;
6、JVM規範如何要求內存屏障;
7、硬件層級內存屏障如何幫助java實現高併發;
8、面試第3題(線程間通訊)的8種解法;
9、作業;
訓練營第二天:
1、線程池的學與思;
2、使用線程池的好與不好;
3、爲什麼阿里開發手冊建議自定義線程池;
4、自定義線程池的最佳實踐;
5、常見線程池類型與應用場景:
1)CachedPool
2)FixedThreadPool
3)ScheduledPool
4)WorkStealingPool
5)ForkJoinPool
6、比線程更牛X的線程,壓測結果展現線程的威力;
7、總結;
相關的電子書、底層源碼
放在最後
總的來說,自己如果有想要去的大公司,一定要提升好自己,讓自己的能力和素質與公司匹配的上,我也一直相信,機會永遠是留給有準備的人。無論是學習還是工作,都應該有主動性,所以如果擁有大廠夢,那麼就要自己努力去實現它。
以上學習資料均免費放送,最後祝願各位身體健康,順利拿到心儀的offer!
轉發和評論這篇文章,然後關注小編,後臺私信【多線程】即可打包帶走所有資料~