Java線程和進程相關面試題與答案總結

有幾天沒有寫一寫博客了,今天就帶給你們一些面試題和參考答案吧!html

 

這些都是上海尚學堂Java培訓的學員去面試時遇到的問題,今天總結出來的是Java線程相關類的面試題。把參考答案和解析也發佈出來,供你們學習參考。java



1.線程是什麼?進程是什麼?兩者有什麼區別和聯繫?

(1)線程是CPU獨立運行和獨立調度的基本單位;
(2)進程是資源分配的基本單位;是執行着的應用程序
二者的聯繫:進程和線程都是操做系統所運行的程序運行的基本單元。

區別:
(1)進程具備獨立的空間地址,一個進程崩潰後,在保護模式下不會對其它進程產生影響。
(2)線程只是一個進程的不一樣執行路徑,線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。面試

進程是執行着的應用程序,而線程是進程內部的一個執行序列。一個進程能夠有多個線程。線程又叫作輕量級進程。多線程

 

二、線程和進程各自有什麼區別和優劣呢?

 

  • 進程是資源分配的最小單位,線程是程序執行的最小單位。併發

  • 進程有本身的獨立地址空間,每啓動一個進程,系統就會爲它分配地址空間,創建數據表來維護代碼段、堆棧段和數據段,這種操做很是昂貴。而線程是共享進程中的數據的,使用相同的地址空間,所以CPU切換一個線程的花費遠比進程要小不少,同時建立一個線程的開銷也比進程要小不少。框架

  • 線程之間的通訊更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通訊須要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。學習

  • 可是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另一個進程形成影響,由於進程有本身獨立的地址空間。this

 

三、建立線程有幾種不一樣的方式?你喜歡哪種?爲何?

 

有三種方式能夠用來建立線程:spa

  • 繼承Thread類操作系統

  • 實現Runnable接口

  • 應用程序可使用Executor框架來建立線程池

 

實現Runnable接口這種方式更受歡迎,由於這不須要繼承Thread類。在應用設計中已經繼承了別的對象的狀況下,這須要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是很是高效的,很容易實現和使用。

 

四、歸納的解釋下線程的幾種可用狀態。

 

線程在執行過程當中,能夠處於下面幾種狀態:

  • 就緒(Runnable):線程準備運行,不必定立馬就能開始執行。

  • 運行中(Running):進程正在執行線程的代碼。

  • 等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。

  • 睡眠中(Sleeping):線程被強制睡眠。

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

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

  • 死亡(Dead):線程完成了執行。

 

五、同步方法和同步代碼塊的區別是什麼?

 

在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)、以上規則對其它對象鎖一樣適用。

 

六、在監視器(Monitor)內部,是如何作線程同步的?程序應該作哪一種級別的同步?

 

監視器和鎖在Java虛擬機中是一塊使用的。監視器監視一塊同步代碼塊,確保一次只有一個線程執行同步代碼塊。每個監視器都和一個對象引用相關聯。線程在獲取鎖以前不容許執行同步代碼。

 

七、什麼是死鎖(deadlock)?

 

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

 

八、如何確保N個線程能夠訪問N個資源同時又不致使死鎖?

 

使用多線程的時候,一種很是簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制線程按照指定的順序獲取鎖。所以,若是全部的線程都是以一樣的順序加鎖和釋放鎖,就不會出現死鎖了。
 

九、如何避免死鎖?

多線程產生死鎖的四個必要條件:
  1. 互斥條件:一個資源每次只能被一個進程使用。
  2. 保持和請求條件:一個進程因請求資源而阻塞時,對已得到資源保持不放。
  3. 不可剝奪調教:進程已得到資源,在未使用完成前,不能被剝奪。
  4. 循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。
只要破壞其中任意一個條件,就能夠避免死鎖,其中最簡單的就是破環循環等待條件。按同一順序訪問對象,加載鎖,釋放鎖。


以上就是Java線程類常見的面試題和答案,Java線程也是面試必考的重點內容。上海java培訓在此就着重講述這些知識要點。

更多Java線程相關文章閱讀推薦:

Java面試題解析,Java面試必考知識點
Java多線程的使用_上海java培訓
Java進程和Java多線程的概念和優勢_上海java培訓
Java多線程實現的四種方式以及優缺點_上海java培訓
【上海java培訓】Hibernate的悲觀鎖和樂觀鎖兩種鎖機制

相關文章
相關標籤/搜索