Java執行緒類相關面試題與答案總結

java隋七哥發表於2018-11-28

天總結出來的是Java執行緒相關類的面試題。把參考答案和解析也釋出出來,供大家學習參考。

1.執行緒是什麼?程式是什麼?二者有什麼區別和聯絡?

(1)執行緒是CPU獨立執行和獨立排程的基本單位;

(2)程式是資源分配的基本單位;是執行著的應用程式

兩者的聯絡:程式和執行緒都是作業系統所執行的程式執行的基本單元。

區別:

(1)程式具有獨立的空間地址,一個程式崩潰後,在保護模式下不會對其它程式產生影響。

(2)執行緒只是一個程式的不同執行路徑,執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程式死掉。

程式是執行著的應用程式,而執行緒是程式內部的一個執行序列。一個程式可以有多個執行緒。執行緒又叫做輕量級程式。

2、執行緒和程式各自有什麼區別和優劣呢?

程式是資源分配的最小單位,執行緒是程式執行的最小單位。

程式有自己的獨立地址空間,每啟動一個程式,系統就會為它分配地址空間,建立資料表來維護程式碼段、堆疊段和資料段,這種操作非常昂貴。而執行緒是共享程式中的資料的,使用相同的地址空間,因此CPU切換一個執行緒的花費遠比程式要小很多,同時建立一個執行緒的開銷也比程式要小很多。

執行緒之間的通訊更方便,同一程式下的執行緒共享全域性變數、靜態變數等資料,而程式之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多執行緒程式的難點。

但是多程式程式更健壯,多執行緒程式只要有一個執行緒死掉,整個程式也死掉了,而一個程式死掉並不會對另外一個程式造成影響,因為程式有自己獨立的地址空間。

3、建立執行緒有幾種不同的方式?你喜歡哪一種?為什麼?

有三種方式可以用來建立執行緒:

繼承Thread類

實現Runnable介面

應用程式可以使用Executor框架來建立執行緒池

實現Runnable介面這種方式更受歡迎,因為這不需要繼承Thread類。在應用設計中已經繼承了別的物件的情況下,這需要多繼承(而Java不支援多繼承),只能實現介面。同時,執行緒池也是非常高效的,很容易實現和使用。

4、概括的解釋下執行緒的幾種可用狀態。

執行緒在執行過程中,可以處於下面幾種狀態:

就緒(Runnable):執行緒準備執行,不一定立馬就能開始執行。

執行中(Running):程式正在執行執行緒的程式碼。

等待中(Waiting):執行緒處於阻塞的狀態,等待外部的處理結束。

睡眠中(Sleeping):執行緒被強制睡眠。

I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待獲取鎖。

死亡(Dead):執行緒完成了執行。

推薦一個交流學習群,裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

點選:加入

5、同步方法和同步程式碼塊的區別是什麼?

在Java語言中,每一個物件有一把鎖。執行緒可以使用synchronized關鍵字來獲取物件上的鎖。synchronized關鍵字可應用在方法級別(粗粒度鎖)或者是程式碼塊級別(細粒度鎖)。

Java語言的關鍵字,當它用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。

(1)、當兩個併發執行緒訪問同一個物件object中的這個synchronized(this)同步程式碼塊時,一個時間內只能有一個執行緒得到執行。另一個執行緒必須等待當前執行緒執行完這個程式碼塊以後才能執行該程式碼塊。

(2)、然而,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,另一個執行緒仍然可以訪問該object中的非synchronized(this)同步程式碼塊。

(3)、尤其關鍵的是,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,其他執行緒對object中所有其它synchronized(this)同步程式碼塊的訪問將被阻塞。

(4)、第三個例子同樣適用其它同步程式碼塊。也就是說,當一個執行緒訪問object的一個synchronized(this)同步程式碼塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步程式碼部分的訪問都被暫時阻塞。

(5)、以上規則對其它物件鎖同樣適用。

6、在監視器(Monitor)內部,是如何做執行緒同步的?程式應該做哪種級別的同步?

監視器和鎖在Java虛擬機器中是一塊使用的。監視器監視一塊同步程式碼塊,確保一次只有一個執行緒執行同步程式碼塊。每一個監視器都和一個物件引用相關聯。執行緒在獲取鎖之前不允許執行同步程式碼。

7、什麼是死鎖(deadlock)?

兩個程式都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是兩個程式都陷入了無限的等待中。

8、如何確保N個執行緒可以訪問N個資源同時又不導致死鎖?

使用多執行緒的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制執行緒按照指定的順序獲取鎖。因此,如果所有的執行緒都是以同樣的順序加鎖和釋放鎖,就不會出現死鎖了。

9、如何避免死鎖?

多執行緒產生死鎖的四個必要條件:

互斥條件:一個資源每次只能被一個程式使用。

保持和請求條件:一個程式因請求資源而阻塞時,對已獲得資源保持不放。

不可剝奪調教:程式已獲得資源,在未使用完成前,不能被剝奪。

迴圈等待條件:若干程式之間形成一種頭尾相接的迴圈等待資源關係。

只要破壞其中任意一個條件,就可以避免死鎖,其中最簡單的就是破環迴圈等待條件。按同一順序訪問物件,載入鎖,釋放鎖。

以上就是Java執行緒類常見的面試題和答案,Java執行緒也是面試必考的重點內容。

推薦一個交流學習群,裡面會分享一些資深架構師錄製的視訊錄影:有Spring,MyBatis,Netty原始碼分析,高併發、高效能、分散式、微服務架構的原理,JVM效能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

點選:加入


相關文章