Java面試之多執行緒&併發篇(8)

码路编程發表於2024-11-25

前言

本來想著給自己放鬆一下,刷刷部落格,突然被幾道面試題難倒!引用型別有哪些?有什麼區別?說說ThreadLocal原理?執行緒池原理知道嗎?以及核心引數?執行緒池的拒絕策略有哪些?似乎有點模糊了,那就大概看一下面試題吧。好記性不如爛鍵盤

*** 12萬字的java面試題整理 ***
*** java核心面試知識整理 ***
*** Java高頻面試講解影片(知識涵蓋齊全) ***

引用型別有哪些?有什麼區別?

引用型別主要分為強軟弱虛四種:

  1. 強引用指的就是程式碼中普遍存在的賦值方式,比如A a = new A()這種。強引用關聯的物件,永遠不會被GC回收。
  2. 軟引用可以用SoftReference來描述,指的是那些有用但是不是必須要的物件。系統在發生記憶體溢位前會對這類引用的物件進行回收。
  3. 弱引用可以用WeakReference來描述,他的強度比軟引用更低一點,弱引用的物件下一次GC的時候一定會被回收,而不管記憶體是否足夠。
  4. 虛引用也被稱作幻影引用,是最弱的引用關係,可以用PhantomReference來描述,他必須和ReferenceQueue一起使用,同樣的當發生GC的時候,虛引用也會被回收。可以用虛引用來管理堆外記憶體。

說說ThreadLocal原理?

threadLocal可以理解為執行緒本地變數,他會在每個執行緒都建立一個副本,那麼線上程之間訪問內部副本變數就行了,做到了執行緒之間互相隔離,相比於synchronized的做法是用空間來換時間。
ThreadLocal有一個靜態內部類ThreadLocalMap,ThreadLocalMap又包含了一個Entry陣列,Entry本身是一個弱引用,他的key是指向ThreadLocal的弱引用,Entry具備了儲存key value鍵值對的能力。
弱引用的目的是為了防止記憶體洩露,如果是強引用那麼ThreadLocal物件除非執行緒結束否則始終無法被回收,弱引用則會在下一次GC的時候被回收。
但是這樣還是會存在記憶體洩露的問題,假如key和ThreadLocal物件被回收之後,entry中就存在key為null,但是value有值的entry物件,但是永遠沒辦法被訪問到,同樣除非執行緒結束執行。
但是隻要ThreadLocal使用恰當,在使用完之後呼叫remove方法刪除Entry物件,實際上是不會出現這個問題的。

執行緒池原理知道嗎?以及核心引數

首先執行緒池有幾個核心的引數概念:

  1. 最大執行緒數maximumPoolSize
  2. 核心執行緒數corePoolSize
  3. 活躍時間keepAliveTime
  4. 阻塞佇列workQueue
  5. 拒絕策略RejectedExecutionHandler

當提交一個新任務到執行緒池時,具體的執行流程如下:

  1. 當我們提交任務,執行緒池會根據corePoolSize大小建立若干任務數量執行緒執行任務
  2. 當任務的數量超過corePoolSize數量,後續的任務將會進入阻塞佇列阻塞排隊
  3. 當阻塞佇列也滿了之後,那麼將會繼續建立(maximumPoolSize-corePoolSize)個數量的執行緒來執行任務,如果任務處理完成,maximumPoolSize-corePoolSize額外建立的執行緒等待keepAliveTime之後被自動銷燬
  4. 如果達到maximumPoolSize,阻塞佇列還是滿的狀態,那麼將根據不同的拒絕策略對應處理

執行緒池的拒絕策略有哪些?

主要有4種拒絕策略:

  1. AbortPolicy:直接丟棄任務,丟擲異常,這是預設策略
  2. CallerRunsPolicy:只用呼叫者所在的執行緒來處理任務
  3. DiscardOldestPolicy:丟棄等待佇列中最舊的任務,並執行當前任務
  4. DiscardPolicy:直接丟棄任務,也不丟擲異常

相關文章