??大家好,我是陳哈哈,北漂五年,相信大家和我一樣,
都有一個大廠夢,作為一名資深Java選手,深知面試重要性,接下來我準備用100天時間,基于Java崗面試中的高頻面試題,以每日3題的形式,帶你過一遍熱門面試題及恰如其分的解答,
??一路走來,隨著問題加深,發現不會的也愈來愈多,但底氣著實足了不少,相信不少朋友和我一樣,榷訓月累才是最有效的學習方式!想起高中時一位女同學的座右銘:只有沉下去,才能浮上來,共勉(juan),

??LOL世界賽開始了,來一波LPL、LCK和LEC三個賽區女主持旗袍留念,穿個旗袍能讓我們有什么壞心思呢😅😅?是吧鐵子們?
車票
- 面試題1:什么是執行緒阻塞?什么情況會導致執行緒阻塞
- 追問1:執行緒阻塞會導致行程阻塞么?
- 面試題2:怎么理解阻塞和非阻塞
- 面試題3:怎么理解并發和并行
- 每日小結
??本欄目Java開發崗高頻面試題主要出自以下各技術堆疊:Java基礎知識、集合容器、并發編程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL資料庫、Redis快取、RabbitMQ訊息佇列、Linux操作技巧等,
面試題1:什么是執行緒阻塞?什么情況會導致執行緒阻塞
??在某一時刻某一個執行緒在運行一段代碼的時候,這時候另一個執行緒也需要運行,但是在運行程序中的那個執行緒執行完成之前,另一個執行緒是無法獲取到CPU執行權的(呼叫sleep方法是進入到睡眠暫停狀態,但是CPU執行權并沒有交出去,而呼叫wait方法則是將CPU執行權交給另一個執行緒),這個時候就會造成執行緒阻塞,
java程式中出現執行緒阻塞的幾種情況:

1、睡眠狀態:
??Thread.sleep (long millis)方法,使執行緒轉到阻塞狀態,millis引數設定睡眠的時間,以毫秒為單位,當睡眠結束后,就轉為就緒(Runnable)狀態,sleep()平臺移植性好,
2、等待狀態:
??當一個執行緒正在運行時呼叫了wait()方法,此時該執行緒需要交出CPU執行權,也就是將鎖釋放出去,交給另一個執行緒,該執行緒進入等待狀態,但與睡眠狀態不一樣的是,進入等待狀態的執行緒不需要設定睡眠時間,但是需要執行notify()或者notifyall()來對其喚醒,自己是不會主動醒來的,等被喚醒之后,該執行緒也會進入就緒狀態,但是進入僅需狀態的該執行緒手里是沒有執行權的,也就是沒有鎖,而睡眠狀態的執行緒一旦蘇醒,進入就緒狀態時是自己還拿著鎖的,
3、禮讓狀態:
??Thread.yield() 方法,暫停當前正在執行的執行緒物件,把執行機會讓給相同或者更高優先級的執行緒,yield() 使得執行緒放棄當前分得的 CPU 時間,但是不使執行緒阻塞,即執行緒仍處于可執行狀態,隨時可能再次分得 CPU 時間,呼叫 yield() 的效果等價于調度程式認為該執行緒已執行了足夠的時間從而轉到另一個執行緒,
4、自閉狀態:
??當一個執行緒正在運行時,呼叫了一個join()方法,此時該執行緒會進入阻塞狀態,另一個執行緒會運行,直到運行結束后,原執行緒才會進入就緒狀態,這個比較像是”走后門“,本來該先把你的事情解決完了再解決后邊的人的事情,但是這時候有走后門的人,那就會停止給你解決,而優先把走后門的人事情解決了;
5、suspend() 和 resume() :
??兩個方法配套使用,suspend()使得執行緒進入阻塞狀態,并且不會自動恢復,必須其對應的resume() 被呼叫,才能使得執行緒重新進入可執行狀態,
??典型地,suspend() 和 resume() 被用在等待另一個執行緒產生的結果的情形:測驗發現結果還沒有產生后,讓執行緒阻塞,另一個執行緒產生了結果后,呼叫 resume() 使其恢復,Thread中suspend()和resume()兩個方法在JDK1.5中已經廢除,因為有死鎖傾向,
追問1:執行緒阻塞會導致行程阻塞么?
回答這個問題,我們得了解一下執行緒模型(下述對應關系為 執行緒對內核調度物體)
- 多對1用戶級執行緒模型
- 1對1內核級執行緒模型
- 多對多兩級執行緒模型
多對1用戶級執行緒模型

- 執行緒的創建、調度、同步,由所屬行程的用戶空間執行緒庫實作,
- 用戶態執行緒,對內核幾乎是透明的(許多操作不需要內核接管)
- 但執行緒總要有一些操作經過內核,比如系統呼叫,
- 不需要頻繁的內核態/用戶態切換,處理速度非常快,
- 該模式下,當行程的某個執行緒,系統呼叫(比如I/O)阻塞時,該行程也會阻塞,
??該模式下,行程的所有執行緒,都對應一個內核調度物體(KES),多對一,并且內核不知道這個行程有哪些執行緒,KES無法將其他執行緒,調度到其他處理器上,該行程(所有的執行緒)被阻塞,直到本次系統呼叫(比如I/O)結束,
1對1內核級執行緒模型

- 每個用戶執行緒都對應一個的內核調度物體,
- 內核會對每個執行緒進行調度,可以調度到其他處理器上,
- 執行緒每次操作會在用戶態和內核態切換,
- 執行緒數量過多時,對系統性能有影響,
多對多兩級執行緒模型

- 每個用戶執行緒擁有多個內核調度物體
- 多個用戶執行緒也可以對應一個內核調度物體
- 實作該模型非常復雜,
執行緒阻塞時,在多對1用戶級執行緒模型下,會導致所屬行程阻塞,在1對1或多對多模型下,不會導致行程阻塞,目前linux基本上都采用一對一模型,

課間休息,又來秀一下來自咱們群里同學的搬磚工地,坐標:青島,
作者:內蒙古上單
面試題2:怎么理解阻塞和非阻塞
阻塞和非阻塞關注的是程式在
等待呼叫結果(訊息,回傳值)時的狀態,
阻塞呼叫:指呼叫結果回傳之前,當前執行緒會被掛起,呼叫執行緒只有在得到結果之后才會回傳,
非阻塞呼叫:指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒,
??就像領導周末打電話問我能不能去公司加班,我支支吾吾半天領導沒聽懂我說的啥,如果是阻塞式呼叫,領導(執行緒)會把自己掛起,一直追問我直到我告訴他能不能去,
??而如果是非阻塞式呼叫,領導就給我發了條語音,然后讓我盡快回復他,他就可以摸魚或干別的去了,但老板會時不時看下手機有沒有回復(定時輪詢),

課間休息,又來秀一下來自咱們群里同學的搬磚工地,坐標:青島,
作者:中國精神科醫學研究院主任
面試題3:怎么理解并發和并行
- 你吃飯吃到一半,電話來了,你一直到吃完了以后才去接,這就說明你
不支持并發也不支持并行, - 你吃飯吃到一半,電話來了,你停了下來接了電話,然后一手筷子,一手電話,說一句話,咽一口飯,這說明你
支持并發, - 你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,咽一口飯同時說一句話,這說明你
支持并行,但這光靠一張嘴是辦不到的,至少兩張嘴!
并發的關鍵是:你有處理多個任務的能力,不一定要同時,
并行的關鍵是:你有同時處理多個任務的能力,
所以我認為它們最關鍵的點就是:是否同時,

并發 - 一起執行
并行 - 同時執行
每日小結
??今天我們復習了面試中常問的一些問題,你做到心中有數了么?對了,如果你的朋友也在準備面試,請將這個系列扔給他,如果他認真對待,肯定會感謝你的!!好了,今天就到這里,學廢了的同學,記得在評論區留言:打卡,,給同學們以激勵,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/312119.html
標籤:java
