前言
本來想著給自己放松一下,刷刷博客,突然被幾道面試題難倒!產生死鎖的四個必要條件?如何避免死鎖?線程池核心線程數怎么設置呢?Java線程池中隊列常用類型有哪些?似乎有點模糊了,那就大概看一下面試題吧。好記性不如爛鍵盤
*** 12萬字的java面試題整理 ***
*** java核心面試知識整理 ***
*** Java高頻面試講解視頻(知識涵蓋齊全) ***
產生死鎖的四個必要條件
- 互斥條件:一個資源每次只能被一個線程使用
- 請求與保持條件:一個線程因請求資源而阻塞時,對已獲得的資源保持不放
- 不剝奪條件:進程已經獲得的資源,在未使用完之前,不能強行剝奪
- 循環等待條件:若干線程之間形成一種頭尾相接的循環等待資源關系
如何避免死鎖?
指定獲取鎖的順序,舉例如下:
- 比如某個線程只有獲得A鎖和B鎖才能對某資源進行操作,在多線程條件下,如何避免死鎖?
- 獲得鎖的順序是一定的,比如規定,只有獲得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 是一個沒有大小限制的隊列,因此往隊列中插入數據的操作(生產者)永遠不會被阻塞,而只有獲取數據的操作(消費者)才會被阻塞。
這里能說出前三種也就差不多了,如果能說全那是最好。