還自稱叫Java程式設計師,連這多執行緒常見問題都不知道,嘖嘖嘖

Java架構老李發表於2020-11-30

面試官:問你幾個多執行緒相關的問題吧,說一下導致執行緒死鎖的原因,怎麼解除執行緒死鎖?

程式設計師阿里:這個...死鎖...

(一分鐘後)

面試官:不知道?那好,說一下Lock 和 Synchronized 的區別?

程式設計師阿里:Lock是鎖...

面試官:...會就會,不會就說不會,節省一下時間,sleep 和 wait 的區別總該知道吧?

程式設計師阿里:...不怎麼了解

面試官:那多執行緒的幾種實現方式,什麼是執行緒安全,這總該知道吧?

程式設計師阿里:我們能換個技術點問嗎?

面試官:連多執行緒併發你都一問三不知,還要我們怎麼進行下去?

面試官:連多執行緒問題你都一問三不知,還要我怎麼“放水”?

 


 

在Java開發中,多執行緒一般是指實現多個任務共同執行的技術,是一個比較基礎,也很常用的技術。

要理解多執行緒,需要先搞懂幾個概念:

程式:每個正在系統上執行的程式都是一個程式。每個程式包含一到多個執行緒。程式也可能是整個程式或者是部分程式的動態執行。

 

執行緒:執行緒是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。所以執行緒基本上是輕量級的程式,它負責在單個程式裡執行多工。通常由作業系統負責多個執行緒的排程和執行。執行緒是程式中一個單一的順序控制流程。

 

多執行緒:在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。

 

併發:在作業系統中,併發是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行,但任一個時刻點上只有一個程式在處理機上執行。

多執行緒併發同樣也是面試問題中很大概率會問到的技術點。

下面給大家整理了一套多執行緒併發相關的核心面試點,把所有多執行緒併發常見的面試題彙總到了一起。

這些知識點的導圖和問題的答案詳解的PDF文件都可以免費分享給大家,幫小編轉發一下文章後,私信【多執行緒】免費領取!

Java多執行緒併發

 

 

 

1. JAVA 併發知識庫

2. JAVA 執行緒實現/建立方式

1. 繼承 Thread 類

2. 實現 Runnable 介面

3. ExecutorService、Callable<Class>、Future 有返回值執行緒

4. 基於執行緒池的方式

3. 4 種執行緒池

1. newCachedThreadPool

2. newFixedThreadPool

3. newScheduledThreadPool

4. newSingleThreadExecutor

4. 執行緒生命週期(狀態)

1. 新建狀態(NEW)

2. 就緒狀態(RUNNABLE)

3. 執行狀態(RUNNING)

4. 阻塞狀態(BLOCKED)

  • 等待阻塞(o.wait->等待佇列)
  • 同步阻塞(lock->鎖池)
  • 其他阻塞(sleep/join)

5. 執行緒死亡(DEAD)

  • 正常結束
  • 異常結束
  • 呼叫 stop

5. 終止執行緒 4 種方式

1. 正常執行結束

2. 使用退出標誌退出執行緒

3. Interrupt 方法結束執行緒

4. stop 方法終止執行緒(執行緒不安全)

6. sleep 與 wait 區別

7. start 與 run 區別

8. JAVA 後臺執行緒

9. JAVA 鎖

1. 樂觀

2. 悲觀鎖

3. 自旋鎖

  • 自旋鎖的優缺點
  • 自旋鎖時間閾值(1.6 引入了適應性自旋鎖)
  • 自旋鎖的開啟

4. Synchronized 同步鎖

  • Synchronized 作用範圍
  • Synchronized 核心元件
  • Synchronized 實現

5. ReentrantLock

  • Lock 介面的主要方法
  • 非公平鎖
  • 公平鎖
  • ReentrantLock 與 synchronized
  • ReentrantLock 實現
  • Condition 類和 Object 類鎖方法區別區別
  • tryLock 和 lock 和 lockInterruptibly 的區別

6. Semaphore 訊號量

  • 實現互斥鎖(計數器為 1)
  • 程式碼實現
  • Semaphore 與 ReentrantLock

7. AtomicInteger

8. 可重入鎖(遞迴鎖)

9. 公平鎖與非公平鎖

  • 公平鎖(Fair)
  • 非公平鎖(Nonfair)

10. ReadWriteLock 讀寫鎖

  • 讀鎖
  • 寫鎖

11. 共享鎖和獨佔鎖

  • 獨佔鎖
  • 共享鎖

12. 重量級鎖(Mutex Lock)

13. 輕量級鎖

  • 鎖升級

14. 偏向鎖

15. 分段鎖

16. 鎖優化

  • 減少鎖持有時間
  • 減小鎖粒度
  • 鎖分離
  • 鎖粗化
  • 鎖消除

10. 執行緒基本方法

1. 執行緒等待(wait)

2. 執行緒睡眠(sleep)

3. 執行緒讓步(yield)

4. 執行緒中斷(interrupt)

5. Join 等待其他執行緒終止

6. 為什麼要用 join()方法?

7. 執行緒喚醒(notify)

8. 其他方法

11. 執行緒上下文切換

1. 程式

2. 上下文

3. 暫存器

4. 程式計數器

5. PCB-“切換楨”

6. 上下文切換的活動

7. 引起執行緒上下文切換的原因

12. 同步鎖與死鎖

1. 同步鎖

2. 死鎖

13. 執行緒池原理

1. 執行緒複用

2. 執行緒池的組成

3. 拒絕策略

4. Java 執行緒池工作過程

14. JAVA 阻塞佇列原理

1. 阻塞佇列的主要方法

  • 插入操作
  • 獲取資料操作

2. Java 中的阻塞佇列

3. ArrayBlockingQueue(公平、非公平)

4. LinkedBlockingQueue(兩個獨立鎖提高併發)

5. PriorityBlockingQueue(compareTo 排序實現優先)

6. DelayQueue(快取失效、定時任務)

7. SynchronousQueue(不儲存資料、可用於傳遞資料)

8. LinkedTransferQueue

9. LinkedBlockingDeque

15. CyclicBarrier、CountDownLatch、Semaphore 的用法

1. CountDownLatch(執行緒計數器 )

2. CyclicBarrier(迴環柵欄-等待至 barrier 狀態再全部同時執行)

3. Semaphore(訊號量-控制同時訪問的執行緒個數)

16. volatile 關鍵字的作用(變數可見性、禁止重排序)

1. 變數可見性

2. 禁止重排序

3. 比 sychronized 更輕量級的同步鎖

4. 適用場景

17. 如何在兩個執行緒之間共享資料

1. 將資料抽象成一個類,並將資料的操作作為這個類的方法

2. Runnable 物件作為一個類的內部類

18. ThreadLocal 作用(執行緒本地儲存)

1. ThreadLocalMap(執行緒的一個屬性)

2. 使用場景

19. synchronized 和 ReentrantLock 的區別

1. 兩者的共同點

2. 兩者的不同點

20. ConcurrentHashMap 併發

1. 減小鎖粒度

2. ConcurrentHashMap 分段鎖

  • ConcurrentHashMap 是由 Segment 陣列結構和 HashEntry 陣列結構組成

21. Java 中用到的執行緒排程

1. 搶佔式排程

2. 協同式排程

3. JVM 的執行緒排程實現(搶佔式排程)

4. 執行緒讓出 cpu 的情況

22. 程式排程演算法

1. 優先排程演算法

2. 高優先權優先排程演算法

3. 基於時間片的輪轉排程演算法

23. 什麼是 CAS(比較並交換-樂觀鎖機制-鎖自旋)

1. 概念及特性

2. 原子包 java.util.concurrent.atomic(鎖自旋)

3. ABA 問題

24. 什麼是 AQS(抽象的佇列同步器)

1. Exclusive 獨佔資源-ReentrantLock

2. Share 共享資源-Semaphore/CountDownLatch

3. 同步器的實現是 ABS 核心(state 資源狀態計數)

4. ReentrantReadWriteLock 實現獨佔和共享兩種方式

答案預覽:

 

 

 

這些知識點的導圖和問題的答案詳解的PDF文件都可以免費分享給大家,幫小編三連一下文章後,掃描下方免費領取!

相關文章