更新時間:2019-10-18 11:32:54 來源:動力節(jié)點 瀏覽3207次
今天動力節(jié)點java培訓(xùn)機構(gòu)小編為大家匯總了史上最全的中高級JAVA工程師面試題及答案(三),分別是java設(shè)計模式面試題、JDK源碼面試題及java RPC面試題,希望能夠幫助到正在找工作的中高級JAVA程序員,下面就隨小編一起來看看吧。

java設(shè)計模式面試題
53、單例模式
?。?)懶漢模式-非安全 懶漢模式(線程不安全,可能出現(xiàn)多個Singleton 實例)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
?。?)懶漢模式-安全 懶漢模式 (線程安全)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(3)餓漢模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
?。?)餓漢模式(變種) 餓漢(變種,跟第三種差不多,都是在類初始化即實例化instance)
public class Singleton {
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
(5)靜態(tài)內(nèi)部類,跟三四有細微差別:Singleton類被裝載instance不一定被初始化,因為內(nèi)部類SingletonHolder沒有被主動使用,只有顯示調(diào)用getInstance才會顯示裝載SingletonHolder 類,從而實例化instance
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
?。?)枚舉(既可以避免多線程同步問題,還可以防止被反序列化重建對象)
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
public static void main(String[] args) {
Singleton s = Singleton.INSTANCE;
Singleton s2 = Singleton.INSTANCE;
System.out.println(s==s2);
}
}
輸出結(jié)果:true ??
說明這種方式創(chuàng)建的對象是同一個,因為枚舉類中的INSTANCE是static final類型的,只能被實例化一次。對于Enum中每一個枚舉實例,都是相當(dāng)于一個單獨的Singleton實例。所以借用 《Effective Java》一書中的話, 單元素的枚舉類型已經(jīng)成為實現(xiàn)Singleton的最佳方法
?。?)懶漢升級版
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
策略模式

JDK源碼面試題
54、ThreadLocal的實現(xiàn)原理
ThreadLocal的實現(xiàn)原理,有什么缺點?跟線程池結(jié)合使用要注意什么

原理:Current Thread當(dāng)前線程中有一個ThreadLocalMap對象,它的key是ThreadLocal的弱引用,Value是ThreadLocal調(diào)用set方法設(shè)置的對象值。每一個線程維護一個各自的ThreadLocalMap,所以多個線程之間變量相互隔離,互不干擾。
缺點:存在內(nèi)存泄漏問題,因為當(dāng)ThreadLocal設(shè)置為null后,ThreadLocalMap的key的弱引用指向了null,又沒有任何的強引用指向threadlocal,所以threadlocal會被GC回收掉。但是,ThreadLocalMap的Value不會被回收,CurrentThread當(dāng)前線程的強引用指向了ThreadLocalMap,進而指向了這個Entry,所以只有當(dāng)currentThread結(jié)束強引用斷開后,currentThread、ThreadLocalMap、Entry將全部被GC回收。
所以結(jié)論是:只要currentThread被GC回收,就不會出現(xiàn)內(nèi)存泄漏。但是在currentThread被GC回收之前,threadlocal設(shè)置為null之后的這段時間里,Value不會被回收,比如當(dāng)使用線程池的時候,線程結(jié)束不會被GC回收,會被繼續(xù)復(fù)用,那這個Value肯定還會繼續(xù)存在。如果這個Value很大的情況下,可能就會內(nèi)存泄漏。雖然threadlocal的set和get方法執(zhí)行時會清除key為null的value,但是如果當(dāng)前線程在使用中沒有調(diào)用threadlocal的set或者get方法一樣可能會內(nèi)存泄漏。
跟線程池結(jié)合使用的注意事項:因為線程池中線程復(fù)用的情況,本次的threadlocal中可能已經(jīng)存在數(shù)據(jù),所以上一次使用完threadlocal的變量后,要調(diào)用threadlocal的remove方法清除value。而且要注意調(diào)用完remove后應(yīng)該保證不會再調(diào)用get方法。
55、AQS實現(xiàn)公平鎖和非公平鎖
基于AQS的鎖(比如ReentrantLock)原理大體是這樣:
?。?)有一個state變量,初始值為0,假設(shè)當(dāng)前線程為A,每當(dāng)A獲取一次鎖,status++. 釋放一次,status--.鎖會記錄當(dāng)前持有的線程。
?。?)當(dāng)A線程擁有鎖的時候,status>0. B線程嘗試獲取鎖的時候會對這個status有一個CAS(0,1)的操作,嘗試幾次失敗后就掛起線程,進入一個等待隊列。
?。?)如果A線程恰好釋放,--status==0, A線程會去喚醒等待隊列中第一個線程,即剛剛進入等待隊列的B線程,B線程被喚醒之后回去檢查這個status的值,嘗試CAS(0,1),而如果這時恰好C線程也嘗試去爭搶這把鎖。
非公平鎖實現(xiàn):C直接嘗試對這個status CAS(0,1)操作,并成功改變了status的值,B線程獲取鎖失敗,再次掛起,這就是非公平鎖,B在C之前嘗試獲取鎖,而最終是C搶到了鎖。
公平鎖:C發(fā)現(xiàn)有線程在等待隊列,直接將自己進入等待隊列并掛起,B獲取鎖
java RPC面試題
56、RPC的序列化方式有哪些
?。?)Thrift---facebook ?ProtoBuf---google
(2)Hessian
(3)AVA原生的序列化接口
(4)Json/xml
57、服務(wù)熔斷與服務(wù)降級概念
服務(wù)熔斷:
一般指某個服務(wù)的下游服務(wù)出現(xiàn)問題時采用的手段,而服務(wù)降級一般是從整體層面考慮的。下游服務(wù)出現(xiàn)問題時可以進行服務(wù)熔斷。
??對于目標服務(wù)的請求和調(diào)用大量超時或失敗,這時應(yīng)該熔斷該服務(wù)的所有調(diào)用,并且對于后續(xù)調(diào)用應(yīng)直接返回,從而快速釋放資源,確保在目標服務(wù)不可用的這段時間內(nèi),所有對它的調(diào)用都是立即返回,不會阻塞的。再等到目標服務(wù)好轉(zhuǎn)后進行接口恢復(fù)。
服務(wù)降級:
當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對一些服務(wù)和頁面有策略的降級,以此釋放服務(wù)器資源以保證核心任務(wù)的正常運行。
58、JAVA線程執(zhí)行中怎么kill掉
?。?)通過設(shè)置全局變量標志來控制線程的任務(wù)執(zhí)行完成.進而銷毀線程
(2) 如果線程處于長久的阻塞狀態(tài),可以interrupt脫離線程阻塞狀態(tài)跳出程序體
59、HA主備怎么預(yù)防腦裂
一般采用2個方法
(1)仲裁 當(dāng)兩個節(jié)點出現(xiàn)分歧時,由第3方的仲裁者決定聽誰的。這個仲裁者,可能是一個鎖服務(wù),一個共享盤或者其它什么東西。
?。?)fencing 當(dāng)不能確定某個節(jié)點的狀態(tài)時,通過fencing把對方干掉,確保共享資源被完全釋放,前提是必須要有可靠的fence設(shè)備。
60、性別字段是否需要加索引
1、聚集索引,葉子節(jié)點存儲行記錄,InnoDB索引和記錄是存儲在一起的。
2、普通索引,葉子節(jié)點存儲了主鍵的值。在InnoDB引擎中每個表都會有一個聚集索引,如果表定義了主鍵,那主鍵就是聚集索引.一個表只有一個聚集索引,其余為普通索引.如果性別sex字段定義為普通的索引,那么在使用普通索引查詢時,會先加載普通索引,通過普通索引查詢到實際行的主鍵,用主鍵通過聚集索引去查詢最終的行. 如果不對sex性別字段加索引,那么查找過程就是直接全表掃描查詢到聚集索引定位到行,而不需要普通索引和聚集索引的切換,所以效率可能更高一點。

61、Https的SSL握手過程
Https協(xié)議由兩部分組成:http+ssl,即在http協(xié)議的基礎(chǔ)上增加了一層ssl的握手過程.
?。?)瀏覽器作為發(fā)起方,向網(wǎng)站發(fā)送一套瀏覽器自身支持的加密規(guī)則,比如客戶端支持的加密算法,Hash算法,ssl版本,以及一個28字節(jié)的隨機數(shù)client_random
(2)網(wǎng)站選出一套加密算法和hash算法,生成一個服務(wù)端隨機數(shù)server_random并以證書的形式返回給客戶端瀏覽器,這個證書還包含網(wǎng)站地址、公鑰public_key、證書的頒發(fā)機構(gòu)CA以及證書過期時間。
?。?)瀏覽器解析證書是否有效,如果無效則瀏覽器彈出提示框告警。如果證書有效,則根據(jù)server_random生成一個preMaster_secret和Master_secret[會話密鑰], master_secret 的生成需要 preMaster_key ,并需要 client_random 和 server_random 作為種子。瀏覽器向服務(wù)器發(fā)送經(jīng)過public_key加密的preMaster_secret,以及對握手消息取hash值并使用master_secret進行加密發(fā)送給網(wǎng)站.[客戶端握手結(jié)束通知,表示客戶端的握手階段已經(jīng)結(jié)束。這一項同時也是前面發(fā)送的所有內(nèi)容的hash值,用來供服務(wù)器校驗]
(4)服務(wù)器使用private_key 解密后得到preMaster_secret,再根據(jù)client_random 和 server_random 作為種子得到master_secret.然后使用master_secret解密握手消息并計算hash值,跟瀏覽器發(fā)送的hash值對比是否一致. 然后把握手消息通過master_secret進行對稱加密后返回給瀏覽器.以及把握手消息進行hash且master_secret加密后發(fā)給瀏覽器.[服務(wù)器握手結(jié)束通知,表示服務(wù)器的握手階段已經(jīng)結(jié)束。這一項同時也是前面發(fā)送的所有內(nèi)容的hash值,用來供客戶端校驗。]
(5)客戶端同樣可以使用master_secret進行解密得到握手消息.校驗握手消息的hash值是否跟服務(wù)器發(fā)送過來的hash值一致,一致則握手結(jié)束.通信開始
?。?)以后的通信都是通過master_secret+對稱加密算法的方式進行. 客戶端與服務(wù)器進入加密通信,就完全是使用普通的HTTP協(xié)議,只不過用"會話密鑰"加密內(nèi)容。SSL握手過程中如果有任何錯誤,都會使加密連接斷開,從而阻止了隱私信息的傳輸

非對稱加密算法:RSA,DSA/DSS ?對稱加密算法:AES,RC4,3DES ?HASH算法:MD5,SHA1,SHA256
62、select和epoll的區(qū)別
?。?)select有最大并發(fā)數(shù)限制,默認最大文件句柄數(shù)1024,可修改。epoll沒有最大文件句柄數(shù)限制,僅受系統(tǒng)中進程能打開的最大文件句柄限制。
(2)select效率低,每次都要線性掃描其維護的fd_set集合。epoll只在集合不為空才輪訓(xùn)
(3)select存在內(nèi)核空間和用戶空間的內(nèi)存拷貝問題。??
epoll中減少內(nèi)存拷貝,mmap將用戶空間的一塊地址和內(nèi)核空間的一塊地址同時映射到相同的一塊物理內(nèi)存地址
NIO使用的多路復(fù)用器是epoll
63、Epoll導(dǎo)致的selector空輪詢
Java NIO Epoll 會導(dǎo)致 Selector 空輪詢,最終導(dǎo)致 CPU 100% ??
官方聲稱在 JDK 1.6 版本的 update18 修復(fù)了該問題,但是直到 JDK 1.7 版本該問題仍舊存在,只不過該 BUG 發(fā)生概率降低了一些而已,它并沒有得到根本性解決 Netty的解決方案:
??對 Selector 的 select 操作周期進行統(tǒng)計,每完成一次空的 select 操作進行一次計數(shù),若在某個周期內(nèi)連續(xù)發(fā)生 N 次空輪詢,則判斷觸發(fā)了 Epoll 死循環(huán) Bug。
??然后,Netty 重建 Selector 來解決。判斷是否是其他線程發(fā)起的重建請求,若不是則將原 SocketChannel 從舊的 Selector 上取消注冊,然后重新注冊到新的 Selector 上,最后將原來的 Selector 關(guān)閉。
64、正排索引和倒排索引
正排索引
也叫正向索引,正排表是以document文檔的ID為關(guān)鍵字,記錄了document文檔中所有的關(guān)鍵字keyword的信息,所以在查找某個keyword的時候,會掃描正排表中每個document文檔,直到查出所有包含keyword的文檔。圖示:

倒排索引
也叫反向索引,倒排表示以keyword關(guān)鍵字建立索引,關(guān)鍵詞keyword所對應(yīng)的的表項記錄了出現(xiàn)這個keyword的所有文檔。表項包含了該文檔的ID和在該文檔中出現(xiàn)的位置情況。倒排表一次可以查出keyword關(guān)鍵字對應(yīng)的所有文檔,效率高于正排表。

正排索引是從文檔到關(guān)鍵字的映射(已知文檔求關(guān)鍵字) 倒排索引是從關(guān)鍵字到文檔的映射(已知關(guān)鍵字求文檔)

以上就是動力節(jié)點java培訓(xùn)機構(gòu)小編介紹的“史上最全的中高級JAVA工程師面試題及答案”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
由于“史上最全的中高級JAVA工程師面試題及答案”內(nèi)容太多,本文已滿,請看下文鏈接:
1~24道中高級JAVA工程師面試題及答案請看鏈接:http://www.soulsinkind.com/javazixun/2169.html
25~52道中高級JAVA工程師面試題及答案請看鏈接:http://www.soulsinkind.com/javazixun/2191.html
相關(guān)推薦
相關(guān)閱讀
Java實驗班
0基礎(chǔ) 0學(xué)費 15天面授
Java就業(yè)班
有基礎(chǔ) 直達就業(yè)
Java夜校直播班
業(yè)余時間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)