更新時間:2019-10-18 11:32:54 來源:動力節點 瀏覽2768次
今天動力節點java培訓機構小編為大家匯總了史上最全的中高級JAVA工程師面試題及答案(三),分別是java設計模式面試題、JDK源碼面試題及java RPC面試題,希望能夠幫助到正在找工作的中高級JAVA程序員,下面就隨小編一起來看看吧。
java設計模式面試題
53、單例模式
(1)懶漢模式-非安全 懶漢模式(線程不安全,可能出現多個Singleton 實例)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(2)懶漢模式-安全 懶漢模式 (線程安全)
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;
}
}
(4)餓漢模式(變種) 餓漢(變種,跟第三種差不多,都是在類初始化即實例化instance)
public class Singleton {
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
(5)靜態內部類,跟三四有細微差別:Singleton類被裝載instance不一定被初始化,因為內部類SingletonHolder沒有被主動使用,只有顯示調用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;
}
}
(6)枚舉(既可以避免多線程同步問題,還可以防止被反序列化重建對象)
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);
}
}
輸出結果:true ??
說明這種方式創建的對象是同一個,因為枚舉類中的INSTANCE是static final類型的,只能被實例化一次。對于Enum中每一個枚舉實例,都是相當于一個單獨的Singleton實例。所以借用 《Effective Java》一書中的話, 單元素的枚舉類型已經成為實現Singleton的最佳方法
(7)懶漢升級版
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的實現原理
ThreadLocal的實現原理,有什么缺點?跟線程池結合使用要注意什么
原理:Current Thread當前線程中有一個ThreadLocalMap對象,它的key是ThreadLocal的弱引用,Value是ThreadLocal調用set方法設置的對象值。每一個線程維護一個各自的ThreadLocalMap,所以多個線程之間變量相互隔離,互不干擾。
缺點:存在內存泄漏問題,因為當ThreadLocal設置為null后,ThreadLocalMap的key的弱引用指向了null,又沒有任何的強引用指向threadlocal,所以threadlocal會被GC回收掉。但是,ThreadLocalMap的Value不會被回收,CurrentThread當前線程的強引用指向了ThreadLocalMap,進而指向了這個Entry,所以只有當currentThread結束強引用斷開后,currentThread、ThreadLocalMap、Entry將全部被GC回收。
所以結論是:只要currentThread被GC回收,就不會出現內存泄漏。但是在currentThread被GC回收之前,threadlocal設置為null之后的這段時間里,Value不會被回收,比如當使用線程池的時候,線程結束不會被GC回收,會被繼續復用,那這個Value肯定還會繼續存在。如果這個Value很大的情況下,可能就會內存泄漏。雖然threadlocal的set和get方法執行時會清除key為null的value,但是如果當前線程在使用中沒有調用threadlocal的set或者get方法一樣可能會內存泄漏。
跟線程池結合使用的注意事項:因為線程池中線程復用的情況,本次的threadlocal中可能已經存在數據,所以上一次使用完threadlocal的變量后,要調用threadlocal的remove方法清除value。而且要注意調用完remove后應該保證不會再調用get方法。
55、AQS實現公平鎖和非公平鎖
基于AQS的鎖(比如ReentrantLock)原理大體是這樣:
(1)有一個state變量,初始值為0,假設當前線程為A,每當A獲取一次鎖,status++. 釋放一次,status--.鎖會記錄當前持有的線程。
(2)當A線程擁有鎖的時候,status>0. B線程嘗試獲取鎖的時候會對這個status有一個CAS(0,1)的操作,嘗試幾次失敗后就掛起線程,進入一個等待隊列。
(3)如果A線程恰好釋放,--status==0, A線程會去喚醒等待隊列中第一個線程,即剛剛進入等待隊列的B線程,B線程被喚醒之后回去檢查這個status的值,嘗試CAS(0,1),而如果這時恰好C線程也嘗試去爭搶這把鎖。
非公平鎖實現:C直接嘗試對這個status CAS(0,1)操作,并成功改變了status的值,B線程獲取鎖失敗,再次掛起,這就是非公平鎖,B在C之前嘗試獲取鎖,而最終是C搶到了鎖。
公平鎖:C發現有線程在等待隊列,直接將自己進入等待隊列并掛起,B獲取鎖
java RPC面試題
56、RPC的序列化方式有哪些
(1)Thrift---facebook ?ProtoBuf---google
(2)Hessian
(3)AVA原生的序列化接口
(4)Json/xml
57、服務熔斷與服務降級概念
服務熔斷:
一般指某個服務的下游服務出現問題時采用的手段,而服務降級一般是從整體層面考慮的。下游服務出現問題時可以進行服務熔斷。
??對于目標服務的請求和調用大量超時或失敗,這時應該熔斷該服務的所有調用,并且對于后續調用應直接返回,從而快速釋放資源,確保在目標服務不可用的這段時間內,所有對它的調用都是立即返回,不會阻塞的。再等到目標服務好轉后進行接口恢復。
服務降級:
當服務器壓力劇增的情況下,根據當前業務情況及流量對一些服務和頁面有策略的降級,以此釋放服務器資源以保證核心任務的正常運行。
58、JAVA線程執行中怎么kill掉
(1)通過設置全局變量標志來控制線程的任務執行完成.進而銷毀線程
(2) 如果線程處于長久的阻塞狀態,可以interrupt脫離線程阻塞狀態跳出程序體
59、HA主備怎么預防腦裂
一般采用2個方法
(1)仲裁 當兩個節點出現分歧時,由第3方的仲裁者決定聽誰的。這個仲裁者,可能是一個鎖服務,一個共享盤或者其它什么東西。
(2)fencing 當不能確定某個節點的狀態時,通過fencing把對方干掉,確保共享資源被完全釋放,前提是必須要有可靠的fence設備。
60、性別字段是否需要加索引
1、聚集索引,葉子節點存儲行記錄,InnoDB索引和記錄是存儲在一起的。
2、普通索引,葉子節點存儲了主鍵的值。在InnoDB引擎中每個表都會有一個聚集索引,如果表定義了主鍵,那主鍵就是聚集索引.一個表只有一個聚集索引,其余為普通索引.如果性別sex字段定義為普通的索引,那么在使用普通索引查詢時,會先加載普通索引,通過普通索引查詢到實際行的主鍵,用主鍵通過聚集索引去查詢最終的行. 如果不對sex性別字段加索引,那么查找過程就是直接全表掃描查詢到聚集索引定位到行,而不需要普通索引和聚集索引的切換,所以效率可能更高一點。
61、Https的SSL握手過程
Https協議由兩部分組成:http+ssl,即在http協議的基礎上增加了一層ssl的握手過程.
(1)瀏覽器作為發起方,向網站發送一套瀏覽器自身支持的加密規則,比如客戶端支持的加密算法,Hash算法,ssl版本,以及一個28字節的隨機數client_random
(2)網站選出一套加密算法和hash算法,生成一個服務端隨機數server_random并以證書的形式返回給客戶端瀏覽器,這個證書還包含網站地址、公鑰public_key、證書的頒發機構CA以及證書過期時間。
(3)瀏覽器解析證書是否有效,如果無效則瀏覽器彈出提示框告警。如果證書有效,則根據server_random生成一個preMaster_secret和Master_secret[會話密鑰], master_secret 的生成需要 preMaster_key ,并需要 client_random 和 server_random 作為種子。瀏覽器向服務器發送經過public_key加密的preMaster_secret,以及對握手消息取hash值并使用master_secret進行加密發送給網站.[客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供服務器校驗]
(4)服務器使用private_key 解密后得到preMaster_secret,再根據client_random 和 server_random 作為種子得到master_secret.然后使用master_secret解密握手消息并計算hash值,跟瀏覽器發送的hash值對比是否一致. 然后把握手消息通過master_secret進行對稱加密后返回給瀏覽器.以及把握手消息進行hash且master_secret加密后發給瀏覽器.[服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時也是前面發送的所有內容的hash值,用來供客戶端校驗。]
(5)客戶端同樣可以使用master_secret進行解密得到握手消息.校驗握手消息的hash值是否跟服務器發送過來的hash值一致,一致則握手結束.通信開始
(6)以后的通信都是通過master_secret+對稱加密算法的方式進行. 客戶端與服務器進入加密通信,就完全是使用普通的HTTP協議,只不過用"會話密鑰"加密內容。SSL握手過程中如果有任何錯誤,都會使加密連接斷開,從而阻止了隱私信息的傳輸
非對稱加密算法:RSA,DSA/DSS ?對稱加密算法:AES,RC4,3DES ?HASH算法:MD5,SHA1,SHA256
62、select和epoll的區別
(1)select有最大并發數限制,默認最大文件句柄數1024,可修改。epoll沒有最大文件句柄數限制,僅受系統中進程能打開的最大文件句柄限制。
(2)select效率低,每次都要線性掃描其維護的fd_set集合。epoll只在集合不為空才輪訓
(3)select存在內核空間和用戶空間的內存拷貝問題。??
epoll中減少內存拷貝,mmap將用戶空間的一塊地址和內核空間的一塊地址同時映射到相同的一塊物理內存地址
NIO使用的多路復用器是epoll
63、Epoll導致的selector空輪詢
Java NIO Epoll 會導致 Selector 空輪詢,最終導致 CPU 100% ??
官方聲稱在 JDK 1.6 版本的 update18 修復了該問題,但是直到 JDK 1.7 版本該問題仍舊存在,只不過該 BUG 發生概率降低了一些而已,它并沒有得到根本性解決 Netty的解決方案:
??對 Selector 的 select 操作周期進行統計,每完成一次空的 select 操作進行一次計數,若在某個周期內連續發生 N 次空輪詢,則判斷觸發了 Epoll 死循環 Bug。
??然后,Netty 重建 Selector 來解決。判斷是否是其他線程發起的重建請求,若不是則將原 SocketChannel 從舊的 Selector 上取消注冊,然后重新注冊到新的 Selector 上,最后將原來的 Selector 關閉。
64、正排索引和倒排索引
正排索引
也叫正向索引,正排表是以document文檔的ID為關鍵字,記錄了document文檔中所有的關鍵字keyword的信息,所以在查找某個keyword的時候,會掃描正排表中每個document文檔,直到查出所有包含keyword的文檔。圖示:
倒排索引
也叫反向索引,倒排表示以keyword關鍵字建立索引,關鍵詞keyword所對應的的表項記錄了出現這個keyword的所有文檔。表項包含了該文檔的ID和在該文檔中出現的位置情況。倒排表一次可以查出keyword關鍵字對應的所有文檔,效率高于正排表。
正排索引是從文檔到關鍵字的映射(已知文檔求關鍵字) 倒排索引是從關鍵字到文檔的映射(已知關鍵字求文檔)
以上就是動力節點java培訓機構小編介紹的“史上最全的中高級JAVA工程師面試題及答案”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
由于“史上最全的中高級JAVA工程師面試題及答案”內容太多,本文已滿,請看下文鏈接:
1~24道中高級JAVA工程師面試題及答案請看鏈接:http://m.dabaquan.cn/javazixun/2169.html
25~52道中高級JAVA工程師面試題及答案請看鏈接:http://m.dabaquan.cn/javazixun/2191.html
相關推薦
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習