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

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

前言

本來想著給自己放鬆一下,刷刷部落格,突然被幾道面試題難倒!產生死鎖的四個必要條件?如何避免死鎖?執行緒池核心執行緒數怎麼設定呢?Java執行緒池中佇列常用型別有哪些?似乎有點模糊了,那就大概看一下面試題吧。好記性不如爛鍵盤

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

產生死鎖的四個必要條件

  1. 互斥條件:一個資源每次只能被一個執行緒使用
  2. 請求與保持條件:一個執行緒因請求資源而阻塞時,對已獲得的資源保持不放
  3. 不剝奪條件:程序已經獲得的資源,在未使用完之前,不能強行剝奪
  4. 迴圈等待條件:若干執行緒之間形成一種頭尾相接的迴圈等待資源關係

如何避免死鎖?

指定獲取鎖的順序,舉例如下:

  1. 比如某個執行緒只有獲得A鎖和B鎖才能對某資源進行操作,在多執行緒條件下,如何避免死鎖?
  2. 獲得鎖的順序是一定的,比如規定,只有獲得A鎖的執行緒才有資格獲取B鎖,按順序獲取鎖就可以避免死鎖!!!

執行緒池核心執行緒數怎麼設定呢?

分為CPU密集型和IO密集型
CPU
這種任務消耗的主要是 CPU 資源,可以將執行緒數設定為 N(CPU 核心數)+1,比 CPU 核心數多出來的一個執行緒是為了防止執行緒偶發的缺頁中斷,或者其它原因導致的任務暫停而帶來的影響。一旦任務暫停,CPU 就會處於空閒狀態,而在這種情況下多出來的一個執行緒就可以充分利用 CPU 的空閒時間。

IO密集型
這種任務應用起來,系統會用大部分的時間來處理 I/O 互動,而執行緒在處理 I/O 的時間段內不會佔用 CPU 來處理,這時就可以將 CPU 交出給其它執行緒使用。因此在 I/O 密集型任務的應用中,我們可以多配置一些執行緒,具體的計算方法是 : 核心執行緒數=CPU核心數量*2。

Java執行緒池中佇列常用型別有哪些?

  • ArrayBlockingQueue 是一個基於陣列結構的有界阻塞佇列,此佇列按 FIFO(先進先出)原則對元素進行排序。
  • LinkedBlockingQueue 一個基於連結串列結構的阻塞佇列,此佇列按FIFO (先進先出) 排序元素,吞吐量通常要高於 ArrayBlockingQueue 。
  • SynchronousQueue 一個不儲存元素的阻塞佇列。
  • PriorityBlockingQueue 一個具有優先順序的無限阻塞佇列。 PriorityBlockingQueue 也是基於最小二叉堆實現
  • DelayQueue只有當其指定的延遲時間到了,才能夠從佇列中獲取到該元素。DelayQueue 是一個沒有大小限制的佇列,因此往佇列中插入資料的操作(生產者)永遠不會被阻塞,而只有獲取資料的操作(消費者)才會被阻塞。

這裡能說出前三種也就差不多了,如果能說全那是最好。

相關文章