牛客網Java面試問答每日一記3
阿新 • • 發佈:2021-10-16
- 建立執行緒的幾種方式?
- 概括性解釋執行緒的幾種狀態
- 同步方法和同步程式碼塊的區別
- 監視器內部如何做到執行緒同步?程式應該做到哪種級別的同步?
- 什麼是死鎖?
- 如何確保N個執行緒可以訪問N個資源而又不導致死鎖?
1:繼承 Thread 類,重寫/實現 run方法。 實現 Runnable 介面,實現 run方法。 實現 Callable 介面,重寫 run 方法。 在程式中通過 Executor 框架實現建立執行緒
2:new 建立執行緒物件 runnable 執行緒物件建立完畢執行start方法後處於 runnable 狀態 block 阻塞狀態,等待物件的內建鎖 waiting 等待狀態,等待其他執行緒 time_waitting 有時間限制的等待其他執行緒
dead 死亡狀態,執行緒任務執行完畢,執行緒死亡
3:同步方法鎖住了一個方法(靜態方法則鎖住了一個類),需要當前物件(類物件)的鎖,同步程式碼塊只是鎖住了一塊程式碼,可以隨意選擇什麼作為鎖
4:監視器和鎖在Java虛擬機器中是一塊使用的,監視器監視一塊同步程式碼塊,確保一次只有一個執行緒執行同步程式碼塊。每一個監視器都和一個物件引用相關聯,執行緒在獲取鎖之前不允許執行同步程式碼
5:兩條或多條執行緒彼此互相堵塞,在沒有外力的情況下無法繼續執行的現象叫做死鎖
6:造成死鎖的條件有四個:互斥性,不可剝奪性,資源持續獲取與儲存,形成一個資源獲取閉環。如要不形成死鎖從以上四個方面入手即可。
其中互斥性不可消除,執行緒資源不可剝奪行破壞成本大,不推薦使用只需從另外兩個入手即可。
保證執行緒使用完資源後及時釋放即可保證另一條執行緒獲取資源的順利執行。另外可以對執行緒訪問資源安排順序,這樣就打破了執行緒訪問資源閉環,也不會形成死鎖