Java併發編程面試題(2021最新版)

前言

多線程和併發問題是Java技術面試中面試官比較喜歡問的問題之一。在這裏,從面試的角度列出了大部分重要的問題,可是你仍然應該牢固的掌握Java多線程基礎知識來對應往後碰到的問題,小編這裏還整理了一份併發編程的思惟導圖,方便你們知識的總覽。java

Java併發編程面試題(2021最新版)

小編分享的這份金三銀四Java後端開發面試總結包含了JavaOOP、Java集合容器、Java異常、併發編程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL數據庫、消息中間件MQ、Dubbo、Linux、ZooKeeper、 分佈式&數據結構與算法等26個專題技術點,都是小編在各個大廠總結出來的面試真題,已經有不少粉絲靠這份PDF拿下衆多大廠的offer,今天在這裏總結分享給到你們!【持續更新中!】程序員

完整版Java面試題地址:2021最新面試題合集集錦面試

序號 專題 內容 連接
1 中間件 Java中間件面試題(2021最新版) https://blog.51cto.com/14994509/2692669
2 微服務 Java微服務面試題(2021最新版) http://www.javashuo.com/article/p-haiifnkb-vk.html
3 併發編程 Java併發編程面試題(2021最新版) 持續更新中!
4 Java基礎 Java基礎知識面試題(2021最新版) 持續更新中!
5 Spring Boot Spring Boot面試題(2021最新版) 持續更新中!
6 Redis Redis面試題(2021最新版) 持續更新中!
7 Spring MVC Spring MVC面試題(2021最新版) 持續更新中!
8 Spring Cloud Spring Cloud面試題(2021最新版) 持續更新中!
9 MySQL優化 MySQL優化面試題(2021最新版) 持續更新中!
10 JVM JVM性能調優面試題(2021最新版) 持續更新中!
11 Linux Linux面試題(2021最新版) 持續更新中!
12 Mybatis Mybatis面試題(2021最新版) 持續更新中!
13 網絡編程 TCP,UDP,Socket,Http網絡編程面試題(2021最新版) 持續更新中!
14 設計模式 設計模式面試題(2021最新版) 持續更新中!
15 大數據 大數據面試題100道(2021最新版) 持續更新中!
16 Tomcat Tomcat面試題(2021最新版) 持續更新中!
17 多線程 多線程面試題(2021最新版) 持續更新中!
18 Nginx Nginx_BIO_NIO_AIO面試題(2021最新版) 持續更新中!
19 memcache memcache面試題(2021最新版) 持續更新中!
20 java異常 java異常面試題(2021最新版) 持續更新中!
21 Java虛擬機 Java虛擬機面試題(2021最新版) 持續更新中!
22 Java集合 Java集合面試題(2021最新版) 持續更新中!
23 Git經常使用命令 Git經常使用命令(2021最新版) 持續更新中!
24 Elasticsearch Elasticsearch面試題(2021最新版) 持續更新中!
25 Dubbo Dubbo面試題(2021最新版) 持續更新中!

1、基礎知識

1. 爲何要使用併發編程

  • 充分利用多核CPU的計算能力:經過併發編程的形式能夠將多核CPU的計算能力發揮到極致,性能獲得提高
  • 方便進行業務拆分,提高系統併發能力和性能:在特殊的業務場景下,先天的就適合於併發編程。如今的系統動不動就要求百萬級甚至千萬級的併發量,而多線程併發編程正是開發高併發系統的基礎,利用好多線程機制能夠大大提升系統總體的併發能力以及性能。面對複雜業務模型,並行程序會比串行程序更適應業務需求,而併發編程更能吻合這種業務拆分 。

2. 多線程應用場景

3. 併發編程有什麼缺點

併發編程的目的就是爲了能提升程序的執行效率,提升程序運行速度,可是併發編程並不老是能提升程序運行速度的,並且併發編程可能會遇到不少問題,好比**:內存泄漏、上下文切換、線程安全、死鎖**等問題。算法

4. 併發編程三個必要因素是什麼?

併發編程三要素(線程的安全性問題體如今):數據庫

原子性:原子,即一個不可再被分割的顆粒。原子性指的是一個或多個操做要麼所有執行成功要麼所有執行失敗。編程

可見性:一個線程對共享變量的修改,另外一個線程可以馬上看到。(synchronized,volatile)後端

有序性:程序執行的順序按照代碼的前後順序執行。(處理器可能會對指令進行重排序)設計模式

出現線程安全問題的緣由:數組

  • 線程切換帶來的原子性問題
  • 緩存致使的可見性問題
  • 編譯優化帶來的有序性問題

解決辦法:緩存

  • JDK Atomic開頭的原子類、synchronized、LOCK,能夠解決原子性問題
  • synchronized、volatile、LOCK,能夠解決可見性問題
  • Happens-Before 規則能夠解決有序性問題

5. Java 程序中怎麼保證多線程的運行安全?

6. 並行和併發有什麼區別?

7. 什麼是多線程

多線程:多線程是指程序中包含多個執行流,即在一個程序中能夠同時運行多個不一樣的線程來執行不一樣的任務。

8. 多線程的好處

能夠提升 CPU 的利用率。在多線程程序中,一個線程必須等待的時候,CPU 能夠運行其它的線程而不是等待,這樣就大大提升了程序的效率。也就是說容許單個程序建立多個並行執行的線程來完成各自的任務。

9. 多線程的劣勢:

  • 線程也是程序,因此線程須要佔用內存,線程越多佔用內存也越多;
  • 多線程須要協調和管理,因此須要 CPU 時間跟蹤線程;
  • 線程之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題。

10. 線程和進程區別

進程

一個在內存中運行的應用程序。每一個進程都有本身獨立的一塊內存空間,一個進程能夠有多個線程,好比在Windows系統中,一個運行的xx.exe就是一個進程。

線程

進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程能夠運行多個線程,多個線程可共享數據。

線程具備許多傳統進程所具備的特徵,故又稱爲輕型進程(Light—Weight Process)或進程元;而把傳統的進程稱爲重型進程(Heavy—Weight Process),它至關於只有一個線程的任務。在引入了線程的操做系統中,一般一個進程都有若干個線程,至少包含一個線程。

根本區別:進程是操做系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位

資源開銷:每一個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程能夠看作輕量級的進程,同一類線程共享代碼和數據空間,每一個線程都有本身獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。

包含關係:若是一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,因此線程也被稱爲輕權進程或者輕量級進程。

內存分配:同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的

影響關係:一個進程崩潰後,在保護模式下不會對其餘進程產生影響,可是一個線程崩潰整個進程都死掉。因此多進程要比多線程健壯。

執行過程:每一個獨立的進程有程序運行的入口、順序執行序列和程序出口。可是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,二者都可併發執行

11. 什麼是上下文切換?

多線程編程中通常線程的個數都大於 CPU 核心的個數,而一個 CPU 核心在任意時刻只能被一個線程使用,爲了讓這些線程都能獲得有效執行,CPU 採起的策略是爲每一個線程分配時間片並輪轉的形式。當一個線程的時間片用完的時候就會從新處於就緒狀態讓給其餘線程使用,這個過程就屬於一次上下文切換。

歸納來講就是:當前任務在執行完 CPU 時間片切換到另外一個任務以前會先保存本身的狀態,以便下次再切換回這個任務時,能夠再加載這個任務的狀態。任務從保存到再加載的過程就是一次上下文切換

上下文切換一般是計算密集型的。也就是說,它須要至關可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都須要納秒量級的時間。因此,上下文切換對系統來講意味着消耗大量的 CPU 時間,事實上,多是操做系統中時間消耗最大的操做。

Linux 相比與其餘操做系統(包括其餘類 Unix 系統)有不少的優勢,其中有一項就是,其上下文切換和模式切換的時間消耗很是少。

12. 守護線程和用戶線程有什麼區別呢?

守護線程和用戶線程

  • 用戶 (User) 線程:運行在前臺,執行具體的任務,如程序的主線程、鏈接網絡的子線程等都是用戶線程
  • 守護 (Daemon) 線程:運行在後臺,爲其餘前臺線程服務。也能夠說守護線程是 JVM 中非守護線程的 「傭人」。一旦全部用戶線程都結束運行,守護線程會隨 JVM 一塊兒結束工做

main 函數所在的線程就是一個用戶線程啊,main 函數啓動的同時在 JVM 內部同時還啓動了好多守護線程,好比垃圾回收線程。

比較明顯的區別之一是用戶線程結束,JVM 退出,無論這個時候有沒有守護線程運行。而守護線程不會影響 JVM 的退出。

注意事項:

  1. setDaemon(true)必須在start()方法前執行,不然會拋出 IllegalThreadStateException 異常
  2. 在守護線程中產生的新線程也是守護線程
  3. 不是全部的任務均可以分配給守護線程來執行,好比讀寫操做或者計算邏輯
  4. 守護 (Daemon) 線程中不能依靠 finally 塊的內容來確保執行關閉或清理資源的邏輯。由於咱們上面也說過了一旦全部用戶線程都結束運行,守護線程會隨 JVM 一塊兒結束工做,因此守護 (Daemon) 線程中的 finally 語句塊可能沒法被執行。

13. 如何在 Windows 和 Linux 上查找哪一個線程cpu利用率最高?

Java併發編程面試題(2021最新版)

14. 什麼是線程死鎖

Java併發編程面試題(2021最新版)

15. 造成死鎖的四個必要條件是什麼

  • 互斥條件:在一段時間內某資源只由一個進程佔用。若是此時還有其它進程請求資源,就只能等待,直至佔有資源的進程用畢釋放。
  • 佔有且等待條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對本身已得到的其它資源保持不放。
  • 不可搶佔條件:別人已經佔有了某項資源,你不能由於本身也須要該資源,就去把別人的資源搶過來。
  • 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。(好比一個進程集合,A在等B,B在等C,C在等A)

16. 如何避免線程死鎖

  1. 避免一個線程同時得到多個鎖
  2. 避免一個線程在鎖內同時佔用多個資源,儘可能保證每一個鎖只佔用一個資源
  3. 嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內部鎖機制

17. 建立線程的四種方式

  • 繼承 Thread 類;
public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法正在執
行...");
    }
  • 實現 Runnable 接口;
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run()方法執行
中...");
    }
  • 實現 Callable 接口;
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() {
        System.out.println(Thread.currentThread().getName() + " call()方法執行
中...");
        return 1;
    }
  • 使用匿名內部類方式
public class CreateRunnable {
    public static void main(String[] args) {
        //建立多線程建立開始
        Thread thread = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("i:" + i);
                }
            }
        }
        );
        thread.start();
    }
}

18. 說一下 runnable 和 callable 有什麼區別

Java併發編程面試題(2021最新版)

19. 線程的 run()和 start()有什麼區別?

  • 每一個線程都是經過某個特定Thread對象所對應的方法run()來完成其操做的,run()方法稱爲線程體。經過調用Thread類的start()方法來啓動一個線程。
  • start() 方法用於啓動線程,run() 方法用於執行線程的運行時代碼。run() 能夠重複調用,而 start()只能調用一次。
  • start()方法來啓動一個線程,真正實現了多線程運行。調用start()方法無需等待run方法體代碼執行完畢,能夠直接繼續執行其餘的代碼; 此時線程是處於就緒狀態,並無運行。 而後經過此Thread類調用方法run()來完成其運行狀態, run()方法運行結束, 此線程終止。而後CPU再調度其它線程。
  • run()方法是在本線程裏的,只是線程裏的一個函數,而不是多線程的。 若是直接調用run(),其實就至關因而調用了一個普通函數而已,直接待用run()方法必須等待run()方法執行完畢才能執行下面的代碼,因此執行路徑仍是隻有一條,根本就沒有線程的特徵,因此在多線程執行時要使用 start()方法而不是run()方法。

20. 爲何咱們調用 start() 方法時會執行 run() 方法,爲何咱們不能直接調用 run() 方法?

Java併發編程面試題(2021最新版)

21. 什麼是 Callable 和 Future?

  • Callable 接口相似於 Runnable,從名字就能夠看出來了,可是 Runnable 不會返回結果,而且沒法拋出返回結果的異常,而 Callable 功能更強大一些,被線程執行後,能夠返回值,這個返回值能夠被 Future 拿到,也就是說,Future 能夠拿到異步執行任務的返回值。
  • Future 接口表示異步任務,是一個可能尚未完成的異步任務的結果。因此說 Callable用於產生結果,Future 用於獲取結果。

22. 什麼是 FutureTask

  • FutureTask 表示一個異步運算的任務。FutureTask 裏面能夠傳入一個 Callable 的具體實現類,能夠對這個異步運算的任務的結果進行等待獲取、判斷是否已經完成、取消任務等操做。只有當運算完成的時候結果才能取回,若是運算還沒有完成 get 方法將會阻塞。一個 FutureTask 對象能夠對調用了 Callable 和 Runnable 的對象進行包裝,因爲 FutureTask 也是Runnable 接口的實現類,因此 FutureTask 也能夠放入線程池中。

23. 線程的狀態

Java併發編程面試題(2021最新版)

24. Java 中用到的線程調度算法是什麼?

Java併發編程面試題(2021最新版)

25. 線程的調度策略

Java併發編程面試題(2021最新版)

26. 什麼是線程調度器(Thread Scheduler)和時間分片(Time Slicing )?

Java併發編程面試題(2021最新版)

27. 請說出與線程同步以及線程調度相關的方法。

28. sleep() 和 wait() 有什麼區別?

Java併發編程面試題(2021最新版)

29. 你是如何調用 wait() 方法的?使用 if 塊仍是循環?爲何?

Java併發編程面試題(2021最新版)

30. 爲何線程通訊的方法 wait(), notify()和 notifyAll()被定義在 Object 類裏?

Java併發編程面試題(2021最新版)

31. 爲何 wait(), notify()和 notifyAll()必須在同步方法或者同步塊中被調用?

Java併發編程面試題(2021最新版)

32. Thread 類中的 yield 方法有什麼做用?

Java併發編程面試題(2021最新版)

33. 爲何 Thread 類的 sleep()和 yield ()方法是靜態的?

Java併發編程面試題(2021最新版)

34. 線程的 sleep()方法和 yield()方法有什麼區別?

Java併發編程面試題(2021最新版)

35. 如何中止一個正在運行的線程?

Java併發編程面試題(2021最新版)

36. Java 中 interrupted 和 isInterrupted 方法的區別?

Java併發編程面試題(2021最新版)

37. 什麼是阻塞式方法?

Java併發編程面試題(2021最新版)

38. Java 中你怎樣喚醒一個阻塞的線程?

Java併發編程面試題(2021最新版)

39. notify() 和 notifyAll() 有什麼區別?

Java併發編程面試題(2021最新版)

40. 如何在兩個線程間共享數據?

Java併發編程面試題(2021最新版)

41. Java 如何實現多線程之間的通信和協做?

Java併發編程面試題(2021最新版)

42. 同步方法和同步塊,哪一個是更好的選擇?

Java併發編程面試題(2021最新版)

43. 什麼是線程同步和線程互斥,有哪幾種實現方式?

Java併發編程面試題(2021最新版)

44. 在監視器(Monitor)內部,是如何作線程同步的?程序應該作哪一種級別的同步?

Java併發編程面試題(2021最新版)

45. 若是你提交任務時,線程池隊列已滿,這時會發生什麼

Java併發編程面試題(2021最新版)

46. 什麼叫線程安全?servlet 是線程安全嗎?

Java併發編程面試題(2021最新版)

47. 在 Java 程序中怎麼保證多線程的運行安全?

Java併發編程面試題(2021最新版)

48. 你對線程優先級的理解是什麼?

Java併發編程面試題(2021最新版)

49. 線程類的構造方法、靜態塊是被哪一個線程調用的

Java併發編程面試題(2021最新版)

50. Java 中怎麼獲取一份線程 dump 文件?你如何在 Java 中獲取線程堆棧?

  • Dump文件是進程的內存鏡像。能夠把程序的執行狀態經過調試器保存到dump文件中。
  • 在 Linux 下,你能夠經過命令 kill -3 PID (Java 進程的進程 ID)來獲取 Java應用的 dump 文件。
  • 在 Windows 下,你能夠按下 Ctrl + Break 來獲取。這樣 JVM 就會將線程的 dump 文件打印到標準輸出或錯誤文件中,它可能打印在控制檯或者日誌文件中,具體位置依賴應用的配置。

51. 一個線程運行時發生異常會怎樣?

  • 若是異常沒有被捕獲該線程將會中止執行。Thread.UncaughtExceptionHandler是用於處理未捕獲異常形成線程忽然中斷狀況的一個內嵌接口。當一個未捕獲異常將形成線程中斷的時候,JVM會使用 Thread.getUncaughtExceptionHandler()來查詢線程的 UncaughtExceptionHandler 並將線程和異常做爲參數傳遞給 handler 的 uncaughtException()方法進行處理。

52. Java 線程數過多會形成什麼異常?

Java併發編程面試題(2021最新版)

53. 多線程的經常使用方法

Java併發編程面試題(2021最新版)

2、併發理論

1. Java中垃圾回收有什麼目的?何時進行垃圾回收?

  • 垃圾回收是在內存中存在沒有引用的對象或超過做用域的對象時進行的。
  • 垃圾回收的目的是識別而且丟棄應用再也不使用的對象來釋放和重用資源。

2. 線程之間如何通訊及線程之間如何同步

  • 在併發編程中,咱們須要處理兩個關鍵問題:線程之間如何通訊及線程之間如何同步。通訊是指線程之間以如何來交換信息。通常線程之間的通訊機制有兩種:共享內存和消息傳遞。
  • Java的併發採用的是共享內存模型,Java線程之間的通訊老是隱式進行,整個通訊過程對程序員徹底透明。若是編寫多線程程序的Java程序員不理解隱式進行的線程之間通訊的工做機制,極可能會遇到各類奇怪的內存可見性問題。

3. Java內存模型

  • 共享內存模型指的就是Java內存模型(簡稱JMM),JMM決定一個線程對共享變量的寫入時,能對另外一個線程可見。從抽象的角度來看,JMM定義了線程和主內存之間的抽象關係:線程之間的共享變量存儲在主內存(main memory)中,每一個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存是JMM的一個抽象概念,並不真實存在。它涵蓋了緩存,寫緩衝區,寄存器以及其餘的硬件和編譯器優化。

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

4. 若是對象的引用被置爲null,垃圾收集器是否會當即釋放對象佔用的內存?

  • 不會,在下一個垃圾回調週期中,這個對象將是被可回收的。
  • 也就是說並不會當即被垃圾收集器馬上回收,而是在下一次垃圾回收時纔會釋放其佔用的內存。

5. finalize()方法何時被調用?析構函數(finalization)的目的是什麼?

Java併發編程面試題(2021最新版)

6. 什麼是重排序

Java併發編程面試題(2021最新版)

7. 重排序實際執行的指令步驟

Java併發編程面試題(2021最新版)

8. 重排序遵照的規則

Java併發編程面試題(2021最新版)

9. as-if-serial規則和happens-before規則的區別

Java併發編程面試題(2021最新版)

10. 併發關鍵字 synchronized ?

Java併發編程面試題(2021最新版)

11. 說說本身是怎麼使用 synchronized 關鍵字,在項目中用到了嗎

Java併發編程面試題(2021最新版)

12. 單例模式瞭解嗎?給我解釋一下雙重檢驗鎖方式實現單例模式!」

Java併發編程面試題(2021最新版)

13. 說一下 synchronized 底層實現原理?

Java併發編程面試題(2021最新版)

14. synchronized可重入的原理

Java併發編程面試題(2021最新版)

15. 什麼是自旋

Java併發編程面試題(2021最新版)

16. 多線程中 synchronized 鎖升級的原理是什麼?

Java併發編程面試題(2021最新版)

17. 線程 B 怎麼知道線程 A 修改了變量

  • (1)volatile 修飾變量
  • (2)synchronized 修飾修改變量的方法
  • (3)wait/notify
  • (4)while 輪詢

18. 當一個線程進入一個對象的 synchronized 方法 A 以後,其它線程是否可進入此對象的synchronized 方法 B?

Java併發編程面試題(2021最新版)

19. synchronized、volatile、CAS 比較

  • (1)synchronized 是悲觀鎖,屬於搶佔式,會引發其餘線程阻塞。
  • (2)volatile 提供多線程共享變量可見性和禁止指令重排序優化。
  • (3)CAS 是基於衝突檢測的樂觀鎖(非阻塞)

20. synchronized 和 Lock 有什麼區別?

  • 首先synchronized是Java內置關鍵字,在JVM層面,Lock是個Java類;
  • synchronized 能夠給類、方法、代碼塊加鎖;而 lock 只能給代碼塊加鎖。
  • synchronized 不須要手動獲取鎖和釋放鎖,使用簡單,發生異常會自動釋放鎖,不會形成死鎖; 而 lock 須要本身加鎖和釋放鎖,若是使用不當沒有 unLock()去釋放鎖就會形成死鎖。
  • 經過 Lock 能夠知道有沒有成功獲取鎖,而 synchronized 卻沒法辦到。

21. synchronized 和 ReentrantLock 區別是什麼?

Java併發編程面試題(2021最新版)

22. volatile 關鍵字的做用

Java併發編程面試題(2021最新版)

23. Java 中能建立 volatile 數組嗎?

Java併發編程面試題(2021最新版)

24. volatile 變量和 atomic 變量有什麼不一樣?

Java併發編程面試題(2021最新版)

25. volatile 能使得一個非原子操做變成原子操做嗎?

Java併發編程面試題(2021最新版)

26. synchronized 和 volatile 的區別是什麼?

Java併發編程面試題(2021最新版)

27. final不可變對象,它對寫併發應用有什麼幫助?

Java併發編程面試題(2021最新版)

28. Lock 接口和synchronized 對比同步它有什麼優點?

Java併發編程面試題(2021最新版)

29. 樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?

Java併發編程面試題(2021最新版)

30. 什麼是 CAS

Java併發編程面試題(2021最新版)

31. CAS 的會產生什麼問題?

Java併發編程面試題(2021最新版)

32. 什麼是原子類

Java併發編程面試題(2021最新版)

33. 原子類的經常使用類

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong
  • AtomicReference

34. 說一下 Atomic的原理?

Atomic包中的類基本的特性就是在多線程環境下,當有多個線程同時對單個(包括基本類型及引用類型)變量進行操做時,具備排他性,即當多個線程同時對該變量的值進行更新時,僅有一個線程能成功,而未成功的線程能夠向自旋鎖同樣,繼續嘗試,一直等到執行成功。

35. 死鎖與活鎖的區別,死鎖與飢餓的區別?

Java併發編程面試題(2021最新版)

3、線程池

1. 什麼是線程池?

Java併發編程面試題(2021最新版)

2. 線程池做用?

Java併發編程面試題(2021最新版)

3. 線程池有什麼優勢?

Java併發編程面試題(2021最新版)

4. 什麼是ThreadPoolExecutor?

Java併發編程面試題(2021最新版)

5. 什麼是Executors?

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

6. 線程池四種建立方式?

Java併發編程面試題(2021最新版)

7. 在 Java 中 Executor 和 Executors 的區別?

Java併發編程面試題(2021最新版)

8. 四種構建線程池的區別及特色?

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

9. 線程池都有哪些狀態?

Java併發編程面試題(2021最新版)

10. 線程池中 submit() 和 execute() 方法有什麼區別?

Java併發編程面試題(2021最新版)

11. 什麼是線程組,爲何在 Java 中不推薦使用?

Java併發編程面試題(2021最新版)

12. ThreadPoolExecutor飽和策略有哪些?

Java併發編程面試題(2021最新版)

13. 如何自定義線程線程池?

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

14. 線程池的執行原理?

Java併發編程面試題(2021最新版)

15. 如何合理分配線程池大小?

Java併發編程面試題(2021最新版)

4、併發容器

1. 你常用什麼併發容器,爲何?

  • 答:Vector、ConcurrentHashMap、HasTable
  • 通常軟件開發中容器用的最多的就是HashMap、ArrayList,LinkedList ,等等
  • 可是在多線程開發中就不能亂用容器,若是使用了未加鎖(非同步)的的集合,你的數據就會很是的混亂。由此在多線程開發中須要使用的容器必須是加鎖(同步)的容器。

2. 什麼是Vector

Java併發編程面試題(2021最新版)

3. ArrayList和Vector有什麼不一樣之處?

Java併發編程面試題(2021最新版)

4. 爲何HashTable是線程安全的?

Java併發編程面試題(2021最新版)

Java併發編程面試題(2021最新版)

5. 用過ConcurrentHashMap,講一下他和HashTable的不一樣之處?

Java併發編程面試題(2021最新版)

6. Collections.synchronized * 是什麼?

Java併發編程面試題(2021最新版)

7. Java 中 ConcurrentHashMap 的併發度是什麼?

Java併發編程面試題(2021最新版)

8. 什麼是併發容器的實現?

Java併發編程面試題(2021最新版)

9. Java 中的同步集合與併發集合有什麼區別?

Java併發編程面試題(2021最新版)

10. SynchronizedMap 和 ConcurrentHashMap 有什麼區別?

Java併發編程面試題(2021最新版)

11. CopyOnWriteArrayList 是什麼?

Java併發編程面試題(2021最新版)

12. CopyOnWriteArrayList 的使用場景?

合適讀多寫少的場景。

13. CopyOnWriteArrayList 的缺點?

Java併發編程面試題(2021最新版)

14. CopyOnWriteArrayList 的設計思想?

Java併發編程面試題(2021最新版)

5、併發隊列

1. 什麼是併發隊列:

  • 消息隊列不少人知道:消息隊列是分佈式系統中重要的組件,是系統與系統直接的通訊
  • 併發隊列是什麼:併發隊列多個線程以有次序共享數據的重要組件

2. 併發隊列和併發集合的區別:

  • 隊列遵循「先進先出」的規則,能夠想象成排隊檢票,隊列通常用來解決大數據量採集處理和顯示 的。
  • 併發集合就是在多個線程中共享數據的

3. 怎麼判斷併發隊列是阻塞隊列仍是非阻塞隊列

在併發隊列上JDK提供了Queue接口,一個是以Queue接口下的BlockingQueue接口爲表明的阻塞 隊列,另外一個是高性能(無堵塞)隊列。

4. 阻塞隊列和非阻塞隊列區別

  • 當隊列阻塞隊列爲空的時,從隊列中獲取元素的操做將會被阻塞。
  • 或者當阻塞隊列是滿時,往隊列裏添加元素的操做會被阻塞。
  • 或者試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其餘的線程往空的隊列插入新的元素。
  • 試圖往已滿的阻塞隊列中添加新元素的線程一樣也會被阻塞,直到其餘的線程使隊列從新變得空閒起來

5. 經常使用併發列隊的介紹:

併發隊列的經常使用方法

Java併發編程面試題(2021最新版)

6、併發工具類

1. 經常使用的併發工具類有哪些?

Java併發編程面試題(2021最新版)

面試題答案解析完整文檔:【Java併發編程面試題【附答案解析】

最後

小編分享的文章到這裏就結束了,整理不易,歡迎你們一塊兒交流,喜歡小編分享的文章記得關注我點贊喲,感謝支持!

相關文章
相關標籤/搜索