最常見的15個Java多執行緒,併發面試問題

duiop99發表於2018-08-15

原文地址:https://dzone.com/articles/top-15-java-multithreading-concurrency-interview-q?oid=twitter
原作者: Javin Paul

想要了解常見的Java相關面試問題的更多資訊?看完這篇文章可以瞭解有關投資銀行最佳面試問題的更多資訊。
多執行緒和併發問題是任何Java面試的重要組成部分。如果你要去投資銀行面試,例如巴克萊,花旗銀行,摩根士丹利為股票前端Java開發人員的職位,可以期待很多多執行緒的面試問題。多執行緒和併發是投資銀行訪談的熱門話題,尤其是電子交易開發工作,他們在許多棘手的Java執行緒面試問題上難住候選人。他們希望確保候選人對Java中的多執行緒和併發程式設計有紮實的瞭解,因為他們中大多數業務都和效能相關,這為他們提供了競爭優勢。

例如,用於DMA交易的高容量和低延遲電子交易系統通常是併發的。大多數情況下,他們專注於微秒延遲,這就是為什麼擁有如何有效地最小化延遲和提高吞吐量知識是如此重要。

這些是我最喜歡的關於Java的執行緒面試問題。我沒有提供這些執行緒訪談問題的答案,但我會盡可能給你一個提示。我會更新帖子就詳細的答案,就像我最近在Java中釋出的10個Singleton面試問題一樣。

15 Java Thread Interview Questions and answers

無論如何,這裡是一些常見的Java多執行緒和併發問題列表,這些問題曾是Java開發人員面試投資銀行時遇到的問題,例如: 巴克萊,摩根士丹利,花旗銀行等

  1. 假設你有三個執行緒T1,T2,T3。你如何能保證執行緒T2線上程T1後執行,T3在T2後執行

    這個執行緒面試問題大多是在第一輪或電話篩選輪次中會被問到的,這個多執行緒問題的目的是檢查候選人對“join”方法概念是否熟悉。這個多執行緒問題的答案很簡單 - 可以通過使用Thread類的join方法來實現。

  2. 新的Lock介面較於Java中的同步塊(synchronized block)有什麼優勢?您需要實現一個允許多讀取的高效能快取,但是如何實現單獨寫以保持完整性?

    lock介面在多執行緒和併發程式設計的主要優勢是它提供了兩個獨立的讀寫鎖,使你能夠編寫高效能資料結構,如ConcurrentHashMap條件阻塞(conditional blocking)

    這個Java執行緒面試問題越來越受歡迎,越來越多的後續提問問題基於面試者的回答。

    我強烈建議在任何Java多執行緒面試之前閱讀鎖,因為,現在,它大量用於為客戶端上的電子交易系統構建快取並交換連線空間。

  3. Java多執行緒中sleep和wait方法的區別
    讓我們看一下Java中另一個經常被問到的執行緒面試問題。 這個問題經常會出現在電話面試.這兩者的主要區別在於wait可以釋放鎖或監視器,而sleep在等待時不會釋放任何鎖或監視器。wait用於執行緒間通訊,因為sleep用於在執行時引入暫停。有關詳細資訊,請參閱我的wait vs sleep in Java這篇帖子。

    這裡寫圖片描述

  4. 如何在Java中實現阻塞佇列?
    這是一個相對困難的Java多執行緒面試問題,有很多用意。它可以確定候選人在實際工作中是否使用過執行緒編寫Java程式碼。它可以看到候選人是否充分理解併發場景,你可以根據他的程式碼提出很多後續問題。如果他使用wait()和notify()方法來實現阻塞佇列,一旦候選者成功寫出它,你可以讓他再次使用新的Java 5併發類等來編寫它。

  5. 在Java中如何解決生產者消費者問題? (solution)
    與上面的執行緒問題類似,這個問題本質上更經典,但有時候面試官會進一步問問題,比如“你如何解決Java中的生產者消費者問題?”它可以通過多種方式解決。我已經分享了一種使用Java中的BlockingQueue來解決生產者 - 消費者問題的方法,所以要準備好接受一些驚喜。有時候,他們甚至會要求你實現一個解決哲學家進餐問題的解決方案。

  6. 編寫一個會導致死鎖的程式。你將如何解決Java中的死鎖問題?
    這是我最感興趣的java面試問題,因為,儘管在編寫多執行緒併發程式時死鎖很常見,但許多候選人都無法編寫無死鎖程式碼,而且他們很掙扎。
    只要詢問他們是否有N個資源和N個執行緒來完成操作;那麼,你需要所有的資源。
    用N來替換最簡單的情況和更高的數字這兩種情況,以使問題更加令人生畏。有關死鎖的更多資訊,請參見How to avoid deadlock in Java
    這裡寫圖片描述

  7. 什麼是原子操作?什麼是Java中的原子操作?

    這是一個簡單的Java執行緒訪談問題。另一個後續問題是:你需要同步原子操作嗎?你可以閱讀更多 Java synchronization.

  8. 什麼是Java中的volatile關鍵字?你如何使用它?它與Java中的synchronized方法有什麼不同?
    在對Java 5和Java記憶體模型進行更改之後,基於Java中的volatile關鍵字的執行緒問題變得越來越流行。好好準備一下volatile變數如何確保併發環境中的可見性,排序和一致性。

  9. 什麼是競態條件(race condition)?您如何找到並解決競態條件?
    Java中的另一個多執行緒問題主要出現在高階訪談中。大多數面試官詢問您最近遇到的種族情況,如何解決,有時他們會編寫示例程式碼並要求您檢測競態條件。有關更多資訊,請參閱我的帖子-race condition in Java。在我看來,這是最好的Java執行緒面試問題之一,可以真正測試候選人在解決競爭條件或編寫沒有資料競爭或任何其他競爭條件的程式碼方面的經驗。關於併發主題的最好的書是“Concurrency practices in Java(java併發實戰)”。
  10. 你將如何在Java中進行執行緒轉儲?你將如何分析執行緒轉儲?

    在UNIX中,您可以使用kill -3,然後執行緒轉儲將在Windows上列印日誌,您可以使用“CTRL + Break”。雖然這是一個相當簡單的執行緒訪談問題,如果他們問你如何分析它會變得棘手。執行緒轉儲也可用於分析死鎖情況。

  11. 我們呼叫start()方法時為什麼要在start()方法裡面呼叫run()方法, 為什麼我們不直接呼叫run()方法?
    這是另一個經典的執行緒問題。最初,當我開始編寫執行緒時,我有一些疑問。如今,我主要通過電話採訪或中期和初級Java面試的第一輪面試問題進行詢問。
    以下就是這個問題的答案。當你呼叫start()方法時,它會建立一個新執行緒並執行run()中宣告的程式碼,同時直接呼叫run()方法。這不會建立任何新執行緒並在同一個呼叫執行緒上執行程式碼。關於更多資訊,可以閱讀這篇文章Difference Between Start and Run Method in Thread
    這裡寫圖片描述
  12. java中如何喚醒阻塞執行緒
    這是一個棘手的執行緒問題。阻塞可能由很多方面導致 - 如果執行緒在IO上被阻塞,那麼,我認為沒有辦法打斷執行緒。如果有的話,請告訴我。另一方面,如果由於呼叫wait(),sleep()或join()方法的結果而阻塞執行緒,則可以中斷執行緒,並通過丟擲InterruptedException來喚醒它。有關處理被阻塞執行緒的更多資訊,請參閱我的帖子-How to Deal With Blocking Methods in Java
  13. java中CyclicBarriar 和CountdownLatch區別(答案

    新的Java執行緒面試問題主要是檢查您對JDK 5併發包的熟悉程度。他們的一個區別是,一旦barrier被破壞,您可以重複使用CyclicBarrier,但不能重複使用CountDownLatch。如果您想了解更多資訊,請檢視Udemy的課程-Multithreading and Parallel Computing in Java

  14. 什麼是不可變物件?它如何幫助編寫併發應用程式?
    雖然這個面試問題與執行緒沒有直接關係,但它間接地幫助了很多。如果他們要求你寫一個不可變的類或者問你為什麼String在Java中是不可變的,那麼這個面試問題會變得更加棘手。
  15. 您在多執行緒環境中遇到了哪些常見問題?你是怎麼解決的?

    記憶體干擾,競態條件,死鎖,活鎖和飢餓是多執行緒和併發程式設計帶來的一些問題的一個例子。這些問題是無止境的;如果你弄錯了,他們將難以檢測和除錯。

    這主要是關於Java的基於經驗的面試問題。您可以看到Heinz Kabutz撰寫的Java Concurrency in Practice Course,瞭解實際高效能多執行緒應用程式中遇到的一些實際問題。

這些是我最喜歡的Java執行緒面試問題和投資銀行的常見問題。這個列表並不完整,所以請在下面評論一下你在面試中遇到的一些有趣的Java執行緒問題。本文收集並分享了關於多執行緒方面的精彩面試問題,這不僅有助於面試,而且為學習新的執行緒概念開啟了大門。

其中一位重讀Java的讀者Hemant貢獻了更多的java執行緒面試問題。以下是其他問題:

  1. Java中的綠色執行緒和本機執行緒之間的區別?
  2. 執行緒和程式之間的區別(答案
  3. 什麼是多執行緒中的上下文切換?
  4. 死鎖和活鎖,死鎖和飢餓之間的區別?
  5. Java中使用了什麼執行緒排程演算法?
  6. 什麼是java執行緒排程?
  7. 如何線上程中處理未處理的異常?
  8. 什麼是執行緒組,為什麼建議不要在Java中使用執行緒組?
  9. 為什麼Executor框架比通過應用程式建立和管理執行緒更好?
  10. Java中Executor和Executors之間的區別?(答案)
  11. 如何在Windows和Linux伺服器中找到哪個執行緒佔用最大CPU?

相關文章