歡迎來到魔據教育大數據學院,專注大數據工程師培養!
當前位置:首頁 > IT培訓問題庫 > 【收藏】Java并發編程71道面試題及答案

【收藏】Java并發編程71道面試題及答案

時間:2019-03-07 09:16:57作者:魔據大數據學院

 1、在java中守護線程和本地線程區別?

java中的線程分為兩種:守護線程(Daemon)和用戶線程(User)。

任何線程都可以設置為守護線程和用戶線程,通過方法Thread.setDaemon(bool on);true則把該線程設置為守護線程,反之則為用戶線程。Thread.setDaemon()必須在Thread.start()之前調用,否則運行時會拋出異常。

兩者的區別:

虛擬機(JVM)何時離開,Daemon是為其他線程提供服務,如果全部的User Thread已經撤離,Daemon 沒有可服務的線程,JVM撤離。也可以理解為守護線程是JVM自動創建的線程(但不一定),用戶線程是程序創建的線程;比如JVM的垃圾回收線程是一個守護線程,當所有線程已經撤離,不再產生垃圾,守護線程自然就沒事可干了,當垃圾回收線程是Java虛擬機上僅剩的線程時,Java虛擬機會自動離開。

擴展:Thread Dump打印出來的線程信息,含有daemon字樣的線程即為守護進程,可能會有:服務守護進程、編譯守護進程、windows下的監聽Ctrl+break的守護進程、Finalizer守護進程、引用處理守護進程、GC守護進程。

2、線程與進程的區別?

進程是操作系統分配資源的最小單元,線程是操作系統調度的最小單元。

一個程序至少有一個進程,一個進程至少有一個線程。

3、什么是多線程中的上下文切換?

多線程會共同使用一組計算機上的CPU,而線程數大于給程序分配的CPU數量時,為了讓各個線程都有執行的機會,就需要輪轉使用CPU。不同的線程切換使用CPU發生的切換數據等就是上下文切換。

4、死鎖與活鎖的區別,死鎖與饑餓的區別?

死鎖:是指兩個或兩個以上的進程(或線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

產生死鎖的必要條件:

互斥條件:所謂互斥就是進程在某一時間內獨占資源。

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

不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。

循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

活鎖:任務或者執行者沒有被阻塞,由于某些條件沒有滿足,導致一直重復嘗試、失敗、嘗試、失敗。

活鎖和死鎖的區別在于,處于活鎖的實體是在不斷的改變狀態,所謂的“活”, 而處于死鎖的實體表現為等待;活鎖有可能自行解開,死鎖則不能。

饑餓:一個或者多個線程因為種種原因無法獲得所需要的資源,導致一直無法執行的狀態。

Java中導致饑餓的原因:

高優先級線程吞噬所有的低優先級線程的CPU時間。

線程被永久堵塞在一個等待進入同步塊的狀態,因為其他線程總是能在它之前持續地對該同步塊進行訪問。

線程在等待一個本身也處于永久等待完成的對象(比如調用這個對象的wait方法),因為其他線程總是被持續地獲得喚醒。

5、Java中用到的線程調度算法是什么?

采用時間片輪轉的方式。可以設置線程的優先級,會映射到下層的系統上面的優先級上,如非特別需要,盡量不要用,防止線程饑餓。

6、什么是線程組,為什么在Java中不推薦使用?

ThreadGroup類,可以把線程歸屬到某一個線程組中,線程組中可以有線程對象,也可以有線程組,組中還可以有線程,這樣的組織結構有點類似于樹的形式。

為什么不推薦使用?因為有很多的安全隱患吧,如果需要使用,推薦使用線程池。

7、為什么使用Executor框架?

每次執行任務創建線程 new Thread()比較消耗性能,創建一個線程是比較耗時、耗資源的。

調用 new Thread()創建的線程缺乏管理,被稱為野線程,而且可以無限制的創建,線程之間的相互競爭會導致過多占用系統資源而導致系統癱瘓,還有線程之間的頻繁交替也會消耗很多系統資源。

接使用new Thread() 啟動的線程不利于擴展,比如定時執行、定期執行、定時定期執行、線程中斷等都不便實現。

8、在Java中Executor和Executors的區別?

Executors 工具類的不同方法按照我們的需求創建了不同的線程池,來滿足業務的需求。

Executor 接口對象能執行我們的線程任務。

ExecutorService接口繼承了Executor接口并進行了擴展,提供了更多的方法我們能獲得任務執行的狀態并且可以獲取任務的返回值。

使用ThreadPoolExecutor 可以創建自定義線程池。

Future 表示異步計算的結果,他提供了檢查計算是否完成的方法,以等待計算的完成,并可以使用get()方法獲取計算的結果。

9、什么是原子操作?

原子操作是指一個不受其他操作影響的操作任務單元。原子操作是在多線程環境下避免數據不一致必須的手段。

處理器使用基于對緩存加鎖或總線加鎖的方式來實現多處理器之間的原子操作。

在Java中可以通過鎖和循環CAS的方式來實現原子操作。 CAS操作——Compare & Set,或是 Compare & Swap,現在幾乎所有的CPU指令都支持CAS的原子操作。

int++并不是一個原子操作,所以當一個線程讀取它的值并加1時,另外一個線程有可能會讀到之前的值,這就會引發錯誤。

為了解決這個問題,必須保證增加操作是原子的,在JDK1.5之前我們可以使用同步技術來做到這一點。到JDK1.5,java.util.concurrent.atomic包提供了int和long類型的原子包裝類,它們可以自動的保證對于他們的操作是原子的并且不需要使用同步。

java.util.concurrent這個包里面提供了一組原子類。其基本的特性就是在多線程環境下,當有多個線程同時執行這些類的實例包含的方法時,具有排他性,即當某個線程進入方法,執行其中的指令時,不會被其他線程打斷,而別的線程就像自旋鎖一樣,一直等到該方法執行完成,才由JVM從等待隊列中選擇一個另一個線程進入,這只是一種邏輯上的理解。

10、Java Concurrency API中的Lock接口是什么?對比同步它有什么優勢?

Lock接口比同步方法和同步塊提供了更具擴展性的鎖操作。

他們允許更靈活的結構,可以具有完全不同的性質,并且可以支持多個相關類的條件對象。

它的優勢有:

可以使鎖更公平

可以使線程在等待鎖的時候響應中斷

可以讓線程嘗試獲取鎖,并在無法獲取鎖的時候立即返回或者等待一段時間

可以在不同的范圍,以不同的順序獲取和釋放鎖

整體上來說Lock是synchronized的擴展版,Lock提供了無條件的、可輪詢的、定時的、可中斷的、可多條件隊列的鎖操作。另外Lock的實現類基本都支持非公平鎖和公平鎖,synchronized只支持非公平鎖,當然,在大部分情況下,非公平鎖是高效的選擇。


更多大數據相關資訊敬請關注魔據教育,為您分享最及時的大數據資訊。
學習大數據敬請關注魔據教育微信二維碼。
魔據教育微信二維碼

【版權與免責聲明】如發現內容存在版權問題,煩請提供相關信息發郵件至[email protected],我們將及時溝通與處理。本站內容除非來源注明魔據教育,否則均為網友轉載,涉及言論、版權與本站無關。

全國咨詢熱線:18501996998,值班手機:18501996998(7*24小時)

在線咨詢:張老師QQ 320169340

企業合作服務專線:010-82340234-821, 院校合作洽談專線:010-82340234

Copyright 2001-2019 魔據教育 - 北京華育興業科技有限公司 版權所有,京ICP備17018991號-2

免費在線咨詢立即咨詢

免費索取技術資料立即索取

大數據技術交流QQ:226594285

電話咨詢010-82340234

【看图找生肖】免费