天總結出來的是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線程也是面試必考的重點内容。