




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
高級軟件工程師、項目經理面試題
1、類、對象的概念?
2、簡述抽象?
3、接口與抽象類?
4、內部類(InnerClass)?
5、訪問修飾符限制?
6、Static%finaLabstract、nativessynchronized關鍵字的使用?
11、運行時異常與一般異常有何異同?
14、Http與Https?
16、J2EE的容器與服務器?
17、繼承限制?
19、列舉常見集合框架類型?
20、面向對象的特征?
23、設計模式?
26、存儲過程和函數的區別?
27、游標的作用?如何知道游標已經到了最后?
29、你經常看或仔細研讀過的書有哪些?
高級軟件工程師面試題答案
類、對象的概念:
1)類:具有共同屬性和行為的對象的抽象。類是創建對象的模板。
2)對象:現實世界中的實體。在計算機中,是指可標識的存儲區域。
3)類是對象的抽象、對象是類的實例。
抽象:是從特定的實例中抽取共同性質形成一般化概念的過程。
接II與抽象類:
1)接口和抽象類都用于拍象,接口是抽象類的抽象。
2)接口中只有方法聲明,沒有實現(無方法體);在接口中聲明的方法具有public和abstract
屬性,一個類可以實現多個接口(即多繼承),接口以'分隔;接口中的方法必須全部實現。
3)抽象類可以有部分方法實現,抽象類必須通過繼承才能使用。
內部類(InnerClass):
1)內部類是嵌套在另一個類中的類。
2)內部類用于名稱隱藏和程序代碼的組織,另外內部類擁有直接訪問其外部類所有成員(包
括private的)的權限(無需任何關鍵字修飾)。
3)內部類不可以在其他類或main方法里實例化,必須使用如下方法(非靜態內部類;
外部類.內部類對象名=new外部類().new內部類();
靜態內部類調用方式:
外部類.內部類對象名=new外部類.內部類();
4)非靜態內部類不可以聲明靜態成員;靜態內部類的非靜態成員可以訪問其外部類的靜態
成員,聲明為靜態的成員不可以訪問外部的非靜態成員。
訪問修飾符限制:
Privateprotectedfriendly(default)public
同類YYYY
同包不同類NYYY
同包子類NYYY
不同包不同類NNNY
不同包子類NYNY
Static關鍵字的使用:
1)類成員,直接使用類名?成員調用。
2)靜態方法只能訪問靜態成員。
3)靜態方法不能使用this、super關鍵字。
4)靜態方法不能被非靜態方法重寫或重載。
final關鍵字:
1)被final修飾的變量為常豉不能改變。
2)被final修飾的方法不可以重寫。
3)被final修飾的類不能被繼承。
abstract關鍵字:
1)被abstract修飾的類不能實例化。
2)被abstract修飾的方法只能在子類中實現。
native關鍵字:非Java語言的編寫,例如JNI技術。
synchronized關鍵字:多線程的同步訪問控制。
11、運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現的非正常狀態,運行的異常表示虛擬機的通常操作中可能
遇到的異常,是?種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時
異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。
(Throwable是所有Java程序中錯誤處理的父類,有兩種資類:Error和Exception。
Error:表示由JVM所偵測到的無法預期的錯誤,由于這是屬于JVM層次的嚴重錯誤,導
致JVM無法繼續執行,因此,這是不可捕捉到的,無法采取任何恢復的操作,頂多只能顯
示錯誤信息。
Exception:表示可恢復的冽外,這是可捕捉到的。
Java提供了兩類主要的異常:runtimeexception和checkedexceptiono
checked異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對于這種異常,
JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們
是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。
但是另外一種異常:runtimeexception,也稱運行時異常,我們可以不處理。當出現這樣
的異常時,總是由虛擬機接管。比如:我們從來沒有人去處理過NullPointerException異常,
它就是運行時異常,并且這種異常還是最常見的異常之一。
出現運行時異常后,系統會把異常?直往.上層拋,?直遇到處理代碼。如果沒有處理塊,
到最上層,如果是多線程就由Thread.run。拋出,如果是單線程就被main。拋出。拋出之后,
如果是線程,這個線程也就退出了。如果是主程序拋出的異常,那么這整個程序也就退出了。
運行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過
往往我們不對他處理罷/,也就是說,你如果不對運行時異常進行處理,那么出現運行時異
常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須撲捉所有的運行時異常,決不讓這個處理線程退出。隊列里面出
現異常數據了,正常的處理應該是把異常數據舍棄,然后記錄日志。不應該由于異常數據而
影響下面對正常數據的處理。在這個場景這樣處理可能是一個比較好的應用,但并不代表在
所有的場景你都應該如此,如果在其它場景,遇到了?些錯誤,如果退出程序比較好,這時
你就可以不太理會運行時異常,或者是通過對異常的處理顯式的控制程序退出。
異常處理的目標之一就是為J'把程序從異常中恢復出來。
14、Http與Https:Https即多了安全的Http,s(SecuritySocketLayer)指加密套接字協議層
(簡寫SSL)o
17、繼承限制:
父類對象不可以賦給子類對象,因為子類可能具有更多的成員,反之可以。
19、列舉常見集合框架類型:
1)List、Set、Mapo由這三個接口實現出ArrayList、LinkedListHashSet、TreeSet>HashMap.
TreeMap等常用集介框架。
2)Vector屬于重量級組件不推薦使用。
3)Map類型維護鍵/值對,Hashtable與HashMap相近但效率略低于HashMap、高于TreeMap,
TreeMap優點是可以排序。
4)Set類型可裝入唯一值,HashSet效率高于TreeSet但TreeSet可以維護內部元素的排序狀
態。
5)List類型可按某種特定順序維護元素。ArrayList允許快速隨機訪問,但如果添加或刪除位
于中間的元素時效率很低;LikedList提供最佳循序訪問及快速的中間位置添加刪除元素,
并有addFirst、addLast>getFirstsgetLast、removeFirst>removeLast方“去。
20、面向對象的特征:
1)繼承:通過子類可以實現繼承,子類繼承父類的所有狀態和行為,同時添加自身的狀態
和行為。
2)封裝:將代碼及處理數據綁定在一起的一種編程機制,該機制保證程序和數據不受外部
干擾。
3)多態:包括重載和重寫。重載為編譯時多態,重寫是運行時多態。重載必須是同類中名
稱相同參數不同(包括個數不同和類型不同),但返回類型不同不構成重載;重寫發生于子
類對父類的覆蓋,子類繼承父類方法名相同、參數列表用同、返回類型相同才構成重寫。
23、設計模式:
?個設計模式描述了?個被證實可行的方案。這些方案非常普遍,是具有完整定義的最常用
的模式。一般模式有4個基本要素:模式名稱(patternname)、問題(problem解決方案
(solution)、效果(consequences)o
常見23種模式概述:
1)抽象工廠模式(AbstractFactory):提供一個創建一系列相關或相互依賴對象的接口,
而無需指定它們具體的類。
2)適配器模式(Adapter):將一個類的接口轉換成客戶希望的另外一個接口。適配器模式
使得原本由于接口不兼容而不能一起工作的類可以一起工作。
3)橋梁模式(Bridge):將抽象部分與它的實現部分分離,使它們都可以獨立地變化<
4)建造模式(Builder):將一個復雜對象的構建與它的表示分離,使同樣的構建過程可以
創建不同的表示。
5)責任鏈模式(ChainofResponsiNlity):為解除請求的發送者和接收者之間耦合,而使多
個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這條徒傳遞該請求,直到有
一個對象處理它。
6)命令模式(Command):將一個請求封裝為一個對象,從而可用不同的請求對客戶進行
參數化;對請求排隊或記錄請求日志,以及支持可取消的操作。
7)合成模式(Composite):將對象組合成樹形結構以表示“部分一整體〃的層次結構。它使
得客戶對單個對象和復合對象的使用具有一致性。
8)裝飾模式(Decorator):動態地給一個對象添加一些額外的職責。就擴展功能而言,它
能生成子類的方式更為靈活。
9)門面模式(Facade):為子系統中的一組接口提供一個一致的界面,門面模式定義了一
個高層接口,這個接口使得這一子系統更加容易使用。
10)工廠方法(FactoryMethod):定義一個用于創建對象的接口,讓子類決定將哪一個類
實例化。FactoryMethod使一個類的實例化延遲到其子類。
12)解釋器模式(Interpreter):給定一個語言,定義它的語法的一種表示,并定義一個解
釋器,該解釋器使用該表示解釋語言中的句子。
13)迭代子模式(Iterator):提供一種方法順序訪問一個聚合對象中的各個元素,而又不
需暴露該對象的內部表示,
16)觀察者模式(Observer):定義時象間的一種一對多的依賴關系,以便當一個對象的狀
態發生改變時,所有依賴于它的對象都得到通知并自動刷新。
18)代理模式(Proxy):為其他對象提供一個代理以控制對這個對象的訪問。
19)單例模式(Singleton):保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
26、存儲過程和函數的區別
存儲過程是用戶定義的一系列sql語句的集合,涉及特定表或其它對象的任務,用戶可以調
用存儲過程,而函數通常是數據庫已定義的方法,它接收參數并返回某種類型的值并且不涉
及特定用戶表。
1)什么是線程?
線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際
運作單位。程序員可以通過它進行多處理器編程,你可以變用多線程對運算密集型任務提速。
比如,如果一個線程完成一個任務要100毫秒,那么用十個線程完成改任務只需10亳秒。
Java在語言層面對多線程提供了卓越的支持,它也是一個很好的賣點。欲了解更多詳維信息
請點擊這里。
2)線程和進程有什么區別?
線程是進程的子集,一個進程可以有很多線程,每條線程并行執行不同的任務。不同的
進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。別把它和棧內存搞混,
每個線程都擁有單獨的棧內存用來存儲本地數據。更多詳細信息請直擊這里。
3)如何在Java中實現線程?
在語言層面有兩種方式。java.Iang.Thread類的實例就是一個線程但是它需要調用
java.Iang.Runnable接口來執行,由于線程類本身就是調用的Runnable接口所以你可以繼承
java.Iang.Thread類或者直接調用Runnable接口來重寫run()方法實現線程。更多詳細信息請
點擊這里.
4)用Runnable還是Thread?
這個問題是上題的后續,大家都知道我們可以通過繼承Thread類或者調用Runnable接
口來實現線程,問題是,那個方法更好呢?什么情況下使用它?這個問題很容易回答,如果
你知道Java不支持類的多重繼承,但允許你調用多個接口。所以如果你要繼承其他類,當
然是調用Runnable接口好了。更多詳細信息請點擊這里。
6)Thread類中的start。和run()方法有什么區別?
這個問題經常被問到,但還是能從此區分出面試者對Java線程模型的理解程度。start()
方法被用來啟動新創建的線程,而且start。內部調用了run()方法,這和直接調用run()方法
的效果不?樣。當你調用run()方法的時候,只會是在原來的線程中調用,沒有新的線程啟
動,start。方法才會啟動新線程。更多討論請點擊這里
7)Java中Runnable和Callable有什么不同?
Runnable和Callable都代表那些要在不同的線程中執行的任務。Runnable從JDK1.0開
始就有了,Callable是在JDK1.5增加的。它們的主要區別是Callable的calif)方法可以返回
值和拋出異常,而Runnable的run()方法沒有這些功能,Callable可以返回裝載有計算結果
的Future對象.我的博客有更詳細的說明。
8)Java中CyclicBarrier和CountDownLatch有什么不同?
CyclicBarrier和CcuntDownLatch都可以用來讓一組線程等待其它線程。與
CyclicBarrier不同的是,CountdownLatch不能重新使用c點此查看更多信息和示例代碼。
9)Java內存模型是什么?
Java內存模型規定和指引Java程序在不同的內存架構、CPU和操作系統間有確定性地
行為。它在多線程的情況下尤其重要。Java內存模型對一個線程所做的變動能被其它線程可
見提供了保證,它們之間是先行發生關系。這個關系定義了一些規則讓程序員在并發編程時
思路更清晰。比如,先行發生關系確保了:
線程內的代碼能夠按先后順序執行,這被稱為程序次序規則。
對于同一個鎖,一個解鎖操作一定要發生在時間上后發生的另一個鎖定操作之前,也叫做管
程鎖定規則。
前一個對volatile的寫操作在后一個volatile的讀操作之前,也叫volatile變量規則。
一個線程內的任何操作必需在這個線程的start。調用之后,也叫作線程啟動規則。
一個線程的所有操作都會在線程終止之前,線程終止規則。
?個對象的終結操作必需在這個對象構造完成之后,也叫對象終結規則。
可傳遞性
我強烈建議大家閱讀《Java并發編程實踐》第十六章來加深對Java內存模型的理解。
10)Java中的volatile變量是什么?
volatile是一個特殊的修飾符,只有成員變量才能使用它。在Java并發程序缺少同步類
的情況下,多線程對成員變量的操作對其它線程是透明的。volatile變量可以保證下一個讀
取操作會在前一個寫操作之后發生,就是上一題的volatile變量規則。點擊這里查看更多
volatile的相關內容。
11)什么是線程安全?vector是一個線程安全類嗎?(詳見這里)
如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代
碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一
樣的,就是線程安全的。一個線程安全的計數器類的同一個實例對象在被多個線程使用的情
況下也不會出現計算失誤。很顯然你可以將集合類分成兩組,線程安全和非線程安全的。
Vector是用同步方法來實現線程安全的,而和它相似的ArrayList不是線程安全的。
12)Java中什么是競態條件?舉個例子說明。
競態條件會導致程序在并發情況下出現一些bugs。多線程對一些資源的競爭的時候就
會產生競態條件,如果首先要執行的程序競爭失敗排到后面執行了,那么整個程序就會出現
一些不確定的bugs.這種bugs很難發現而且會重復出現,因為線程間的隨機競爭。一個例
子就是無序處理,詳見答案。
13)Java中如何停止一個線程?
提供了很豐富的但沒有為停止線程提供本來有一些像
JavaAPIAPLJDK1.0stop()z
suspend()和resume。的控制方法但是由于潛在的死鎖威脅因此在后續的JDK版本中他們被
棄用了,之后JavaAPI的設計者就沒有提供一個兼容且線程安全的方法來停止一個線程。當
run()或者call()方法執行完的時候線程會自動結束,如果要手動結束一個線程,你可以用
volatile布爾變量來退出run()方法的循環或者是取消任務來中斷線程。點擊這里杳看示例代
碼。
14)一個線程運行時發生異常會怎樣?
這是我在一次面試中遇到的一個很刁鉆的Java面試題,簡單的說,如果異常沒有被捕獲
該線程將會停止執行。Thread.UncaughtExceptionHandler是用于處理未捕獲異常造成線程突
然中斷情況的一個內嵌接口。當一個未捕獲異常將造成線程中斷的時候JVM會使用
Thread.getUncaughtExceptionHandler()來查詢線程的UncaughtExceptionHandler并將線程和異
常作為參數傳遞給handler的uncaughtException。方法進行處理。
15)如何在兩個線程間共享數據?
你可以通過共享對象來實現這個目的,或者是使用像阻塞隊列這樣并發的數據結構。這
篇教程《Java線程間通信》(涉及到在兩個筱程間共享對象)用wait和notify方法實現了生產
者消費者模型。
16)Java中notify和notifyAII有什么區別?
這又是一個刁鉆的問題,因為多線程可以等待單監控鎖,JavaAPI的設計人員提供了一
些方法當等待條件改變的時候通知它們,但是這些方法沒有完全實現。notify。方法不能喚醒
某個具體的線程,所以只有一個線程在等待的時候它才有用武之地。而notifyAII。喚醒所有
線程并允許他們爭奪鎖確保了至少有一個線程能繼續運行。我的鹿客有更詳細的資料和示例
代碼。
17)為什么wait,notify和notifyAII這些方法不在thread類里面?
這是個設計相大的問題,它考察的是面試者對現有系統和一些普遍存在但看起來不合理
的事物的看法。回答這些問題的時候,你要說明為什么把這些方法放在Object類里是有意
義的,還有不把它放在Thread類里的原因,一個很明顯的原因是JAVA提供的鎖是對象級的
而不是線程級的,每個對象都有鎖,通過線程獲得。如果線程需要等待某些鎖那么調用對象
中的wait。方法就有意義了。如果wait。方法定義在Thread類中,線程正在等待的是哪個鎖
就不明顯了。簡單的說,由于wait,notify和notifyAII都是鎖級別的操作,所以把他們定義
在Object類中因為鎖屬于對象。你也可以查看這篇文篁了解更多。
18)什么是ThreadLocal變量?
ThreadLocal是Java里一種特殊的變量。每個線程都有?個ThreadLocal就是每個線程都
擁有了自己獨立的一個變量,競爭條件被徹底消除了。它是為創建代價高昂的對象獲取線程
安全的好方法,比如你可以用ThreadLocal讓SimpleDateFormat變成線程安全的,因為那個
類創建代價高昂且每次調用都需要創建不同的實例所以不值得在局部范圍使用它,如果為每
個線程提供一個自己獨有的變量拷貝,將大大提高效率。首先,通過復川減少了代價高昂的
對■象的創建個數。其次,你在沒有使用高代價的同步或者不變性的情況下獲得了線程安全。
線程局部變量的另一個不錯的例子是ThreadLocalRandom類,它在多線程環境中減少了創建
代價高昂的Random對象的個數。查看答案了解更多。
19)什么是FutureTask?
在Java并發程序中FutureTask表示一個可以取消的異步運算。它有啟動和取消運算、
查詢運算是否完成和取回運算結果等方法。只有當運算完成的時候結果才能取回,如果運算
尚未完成get方法將會阻塞。一個FutureTask對象可以對調用了Callable和Runnable的對象
進行包裝,由I-FutureTask也是調用了Runnable接I」所以它可以提交給Executor來執行。
20)Java中interrupted和islnterruptedd方法的區別?
interrupted!)和islnterrupted。的主要區別是前者會將中斷狀態清除而后者不會。Java多
線程的中斷機制是用內部標識來實現的,調用TerruptO來中斷一個線程就會設置中
斷標識為true。當中斷線程調用靜態方法TerruDtedO來檢查中斷狀態時,中斷狀態
會被清零,而非靜態方法isInterruptedO用來查詢其它線程的中斷狀態且不會改變中斷狀態
標識。簡單的說就是任何勉出InterruptedException異常的方法都會將中斷狀態清零。無論
如何,一個線程的中斷狀態有有可能被其它線程調用中斷來改變。
21)為什么wait和notify方法要在同步塊中調用?
主要是因為JavaAPI強制要求這樣做,如果你不這么做,你的代碼會拋出
HlegalMonitorStateException異常。還有一個原因是為了避免wait和notify之間產生競態條
件。
22)為什么你應該在循環中檢查等待條件?
處于等待狀態的線程可能會收到錯誤警報和偽喚醒,如果不在循環中檢查等待條件,程
序就會在沒有滿足結束條件的情況下退出。因此,當一個等待線程醒來時,不能認為它原來
的等待狀態仍然是有效的,在notify。方法調用之后和等待線程醒來之前這段時間它可能會
改變。這就是在循環中使用wait()方法效果更好的原因,你可以在Eclipse中創建模板調用
wait和notify試一試。如果你想了解更多關于這個問題的內容,我推薦你閱讀《EffectiveJava》
這本書中的線程和同步章節。
23)Java中的同步集合與并發集合有什么區別?
同步集合與并發集合都為多線程和并發提供了合適的線程安全的集合,不過并發集合的
可擴展性更高。在Javal.5之前程序員們只有同步集合來用且在多線程并發的時候會導致爭
用,阻礙了系統的擴展性,Java5介紹了并發集合像ConcurrentHashMap,不僅提供線程安
全還用鎖分離和內部分區等現代技術提高了可擴展性。更多內容詳見答案。
24)Java中堆和棧有什么不同?
為什么把這個問題歸類在多線程和并發面試題里?因為棧是?塊和線程緊密相關的內
存區域。每個線程都有自己的棧內存,用于存儲本地變量,方法參數和棧調用,一個線程中
存儲的變量對其它線程是不可見的。而堆是所有線程共享的一片公用內存區域。對象都在堆
里創建,為了提升效率線程會從堆中弄一個緩存到自己的棧,如果多個線程使用該變顯就可
能引發問題,這時volatile變量就可以發揮作用了,它要求線程從主存中讀取變量的值,更
多內容詳見笠案。
25)什么是線程池?為什么要使用它?
創建線程要花費昂貴的資源和時間,如果任務來了才創建線程那么響應時間會變長,而
且一個進程能創建的線程數有限。為了避免這些問題,在程序啟動的時候就創建若干線程來
響應處理,它們被稱為線程池,里面的線程叫工作線程。從JDK1.5開始,JavaAPI提供了
Executor框架讓你可以創建不同的線程池。比如單線程池,每次處理一個任務;數目固定的
線程池或者是緩存線程池(一個適合很多生存期短的任務的程序的可擴展線程池)。更多內
容詳見這篇文章。
26)如何寫代碼來解決生產者消費者問題?
在現實中你解決的許多線程問題都屬于生產者消費者模型,就是?個線程生產任務供其
它線程進行消費,你必須知道怎么進行線程間通信來解決這個問題。比較低級的辦法是用
wait和notify來解決這個問題,比較贊的辦法是用Semaphore或者BlockingQueue來實現
生產者消費者模型,這篇教程有實現它。
27)如何避免死鎖?
Java多線程中的死鎖死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造
成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。這是一個嚴重的問題,
因為死鎖會讓你的程序掛起無法完成任務,死鎖的發生必須滿足以下四個條件:
互斥條件:一個資源每次只能被一個進程使用。
請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
避免死鎖最簡單的方法就是阻止循環等待條件,將系統中所有的資源設置標志位、排序,規
定所有的進程申請資源必須以一定的順序(升序或降序)做操作來避免死鎖.這篇教程有代
碼示例和避免死鎖的討論細節。
28)Java中活鎖和死鎖有什么區別?
這是上題的擴展,活鎖和死鎖類似,不同之處在于處于活鎖的線程或進程的狀態是不斷
改變的,活鎖可以認為是一種特殊的饑餓。一個現實的活鎖例子是兩個人在狹小的走廊碰到,
兩個人都試著避讓對方好讓彼此通過,但是因為避讓的方向都一樣導致最后誰都不能通過走
廊。簡單的說就是,活鎖和死鎖的主要區別是前者進程的狀態可以改變但是卻不能繼續執行。
29)怎么檢測一個線程是否擁有鎖?
我一直不知道我們竟然可以檢測一個線程是否擁有鎖,直到我參加了一次電話面試9在
java.Iang.Thread中有一個方法叫holdsLock(),它返回true如果當且僅當當前線程擁有某個具
體對象的鎖。你可以查看這篇文章了解更多。
30)你如何在Java中獲取線程堆棧?
對于不同的操作系統,有多種方法來獲得Java進程的線程堆棧。當你獲取線程堆棧時、
JVM會把所有線程的狀態存到口志文件或者輸出到控制臺。在Windows你可以使用Ctrl+
Break組合鍵來獲取線程堆棧,Linux下用kill-3命令。你也可以用jstack這個工具來荻取,
它對線程id進行操作,你可以用jps這個工具找到id。
31)JVM中哪個參數是用來控制線程的棧堆棧小的
這個問題很簡單,-Xss參數用來控制線程的堆棧大小。你可以查看JVM配置列表來了
解這個參數的更多信息。
32)Javasynchronized和ReentrantLock有什么不同?
Java在過去很長一段時間只能通過synchronized關鍵字來實現互斥,它有一些缺點。比
如你不能擴展鎖之外的方法或者塊邊界,嘗試獲取鎖時不能中途取消等。Java5通過Lock
接口提供了更復雜的控制來解決這些問題。ReentrantLock類實現了Lock,它擁有與
synchronized相同的并發性和內存語義且它還具有可擴展性。你可以宣看這篇文章了解更多
33)有三個線程Tl,T2,T3,怎么確保它們按順序執行?
在多線程中有多種方法讓線程按特定順序執行,你可以用線程類的join。方法在一個線
程中啟動另一個線程,另外一個線程完成該線程繼續執行。為了確保三個線程的順序你應該
先啟動最后一個(T3調用T2,T2調用T1),這樣T1就會先完成而T3最后完成。你可以查看
這篇文章了解更多。
34)Thread類中的yield方法有什么作用?
Yield方法可以暫停當前正在執行的線程對象,讓其它有相同優先級的線程執行。它是
一個靜態方法而且只保證當前線程放棄CPU占用而不能保證使其它線程一定能占用CPU,
執行yield。的線程有可能在進入到暫停狀態后馬上乂被執行。點擊這里查看更多yield方法
的相關內容。
35)Java中ConcurrentHashM叩的并發度是什么?
ConcurrentHashMap把實際map劃分成若干部分來實現它的可擴展性和線程安全。這種
劃分是使用并發度獲得的,它是ConcurrentHashM叩類構造函數的?個可選參數,默認值為
16,這樣在多線程情況下就能避免爭用。欲了解更多并發度和內部大小調整請閱讀我的文章
HowConcurrentHashMapworksinJava。
36)Java中Semaphore是什么?
Java中的Semaphore是一種新的同步類,它是一個計數信號。從概念上講,從概念上
講,信號量維護了一個許可集合。如有必要,在許可可用前會阻塞每一個acquireO,然后
再獲取該許可。每個release。添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,
不使用實際的許可對象,Semaphore只對可用許可的號碼進行計數,并采取相應的行動。信
號量常常用于多線程的代碼中,比如數據庫連接池。更多詳細信息請點擊這里。
37)如果你提交任務時,線程池隊列已滿。會時發會生什么?
這個問題問得很狡猾,許多程序員會認為該任務會阻塞直到線程池隊列有空位。事實上
如果一個任務不能被調度執行那么ThreadPoolExecutor'ssubmitf)方法將會拋出一個
RejectedExecutionException異常。
38)Java線程池中submit。和execute。方法有什么區另U?
兩個方法都可以向線程池提交任務,execute。方法的返回類型是void,它定義在Executor
接口中,而submit。方法可以返阿I持有計算結果的Future對象,它定義在ExecutorService接
口中,它擴展了Executor接口,其它線程池類像ThreadPoolExecutor和
ScheduledThreadPoolExecutor都有這些方法。更多詳細信息請點擊這里。
39)什么是阻塞式方法?
阻塞式方法是指程序會一直等待該方法完成期間不做其他事情,Serversocket的accept()
方法就是一直等待客戶端連接。這里的阻塞是指調用結果返回之前,當前線程會被掛起,直
到得到結果之后才會返回。此外,還有異步和非阻塞式方法在任務完成前就返回。更多詳細
信息請點擊這里O
40)Swing是線程安全的嗎?為什么?
你可以很肯定的給出回答,Swing不是線程安全的,但是你應該解釋這么回答的原因即
便面試官沒有問你為什么,當我們說swing不是線程安全的常常提到它的組件,這些組件不
能在多線程中進行修改,所有對GUI組件的更新都要在AWT線程中完成,而Swing提供了
同步和異步兩種回調方法來進行更新。點擊這里查看更多swing和線程安全的相關內容。
41)Javaff1invokeAndWait和invokeLater有什么區別?
這兩個方法是SwingAPI提供給Java開發者用來從當前線程而不是事件派發線程更新
GUI組件用的。InvokeAndWait。同步更新GUI組件,比如?個進度條,一旦進度更新了,進
度條也要做出相應改變。如果進度被多個線程跟蹤,那么就蜩用invokeAndWait。方法請求事
件派發線程對組件進行相應更新。而invokeLater。方法是異步調用更新組件的。更多詳細信
息請點擊這里。
42)SwingAPI中那些方法是線程安全的?
這個問題又提到了swing和線程安全,雖然組件不是線程安全的但是有一些方法是可以
被多線程安全調用的,比如的方法和
repaint()zrevalidated?JTextComponentsetText()
JTextArea的insert。和append()方法也是線程安全的。
43)如何在Java中創建Immutable對象?
這個問題看起來和多線程沒什么關系,但不變性有助于簡化已經很復雜的并發程序。
Immutable對象可以在沒有同步的情況下共享,降低了對該對象進行并發訪問時的同步化開
銷。可是Java沒有@lmmutable這個注解符,要創建不可變類,要實現下面幾個步驟:通過
構造方法初始化所有成員、對變顯不要提供setter方法、將所有的成員聲明為私有的,這樣
就不允許直接訪問這些成員、在getter方法中,不要直接返I可對象本身,而是克隆對象,并
返回對象的拷貝。我的文章howtomakeanobjectImmutableinJava有詳細的教程,看完你
可以充滿自信。
44)Java中的ReadWriteLock是什么?
一般而言,讀寫鎖是用來提升并發程序性能的鎖分離技術的成果。Java中的
ReadWriteLock是Java5中新增的一個接口,一個ReadWriteLock維護一對關聯的鎖,一個
用于只讀操作一個用于寫。在沒有寫線程的情況下一個讀鎖可能會同時被多個讀線程持有。
寫鎖是獨占的,你可以使用JDK中的ReentrantReadWriteLock來實現這個規則,它最多支持
65535個寫鎖和65535個讀鎖。
45)多線程中的忙循環是什么?
忙循環就是程序員用循環讓一個線程等待,不像傳統方法wait。,sleep。或yield()它們
都放棄了CPU控制,而忙循環不會放棄CPU,它就是在運行一個空循環。這么做的目的是
為了保留CPU緩存,在多核系統中,一個等待線程醒來的時候可能會在另一個內核運行,
這樣會重建緩存。為了避免重建緩存和減少等待重建的時間就可以使用它了。你可以查看這
篇文章獲得更多信息。
46)volatile變量和atomic變量有什么不同?
這是個有趣的問題。首先,volatile變量和atomic變量看起來很像,但功能卻不一樣。
Volatile變量可以確保先行關系,即寫操作會發生在后續的讀操作之前,但它并不能保證原
子性。例如用volatile修飾count變量那么count++操作就不是原子性的。而Atomiclnteger
類提供的atomic方法可以讓這種操作具有原子性如getAndlncrement()方法會原子性的進行
增量操作把當前值加一,其它數據類型和引用變最也可以進行相似操作。
47)如果同步塊內的線程拋出異常會發生什么?
這個問題坑了很多Java程序員,若你能想到鎖是否釋放這條線索來回答還有點希望答
對。無論你的同步塊是正常還是異常退出的,里面的線程都會釋放鎖,所以對比鎖接口我更
喜歡同步塊,因為它不用我花費精力去釋放鎖,該功能可以在finallyblock里釋放鎖實現。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 證券從業資格證考生互動試題及答案
- 分析注冊會計師考試與經濟環境變動之間的關系試題及答案
- 2024年項目管理復習建議試題及答案
- 注冊會計師考試不同階段目標試題及答案
- 從使用者角度看醫療器械使用手冊的內容選擇與表達方式探討
- 地下車庫的安全責任協議書(2篇)
- 供應鏈金融中區塊鏈技術的創新教育方案
- 湖北省楚天協作體2024-2025學年高二下學期4月期中生物試題(原卷版+解析版)
- 河北省邯鄲市成安縣2024-2025學年八年級下學期期中地理試題(原卷版+解析版)
- 2055年甘肅省隴南市禮縣中考一模英語試題(原卷版+解析版)
- GB/T 20899.1-2019金礦石化學分析方法第1部分:金量的測定
- 太陽能光伏發電原理及其應用
- GB 150-1998鋼制壓力容器
- 工程聯系單(模板)
- 2023年海南省財金集團有限公司招聘筆試模擬試題及答案解析
- 耳聾與人工耳蝸植入術課件
- 公司獎項申請表(個人)
- 機油濾清器工作原理剖析
- 執行異議及復議課件
- 工程施工資源配置計劃施工資源配置計劃
- 高中美術教案3-12地域的永恒魅力1
評論
0/150
提交評論