我的技術博客:www.zhenganwen.topjava
上午坐在圖書館前草坪的椅子上看《Netty權威指南》,差很少到了飯點,正準備起身去食堂吃飯,這時迎來一個突如其來的電話,上面顯示:「浙江-杭州」。(所以前並未約面試,不知這就是阿里巴巴菜鳥網絡的面試電話)mysql
Solr
作的,可是當時的項目用的是SpringBoot
,以前學Solr的時候是用Solr
是和Spring
整合,我用SpringBoot
集成Solr
發現版本差別很大,API也不用了,而後Solr
初始配置繁瑣,當時就想換一個搜索框架。而後我據說Elasticsearch
挺好用的,因而就從0開始研究它的API,最後實現了商品搜索必需的一些功能,如關鍵字檢索、結果高亮、聚合等。雖然我對ES的底層瞭解很少,但這一次是我獨立對一個陌生框架的學習並實現了須要的基本功能。在本身的簡歷中寫一些不知底層原理沒有讀過源碼的花裏胡哨的框架技術等於給本身埋坑面試
Java的源碼有沒有看過?redis
那你給我講一下ConcurrentHashMap
和HashMap
的區別。算法
ConcurrentHashMap
的核心思想就是下降鎖粒度以提升併發性能。HashMap
不是線程安全的,HashTable
雖然是線程安全的,但其相對於HashMap
來講,只是簡單地將每一個訪問集合的方法都加了一個synchronized
關鍵字,也就是說任何訪問集合的線程都須要先獲取集合對象對應的鎖,這樣的話同一時刻只能有一個線程操做Map,併發性能弱,若是併發線程較多還會引發屢次上下文切換。而ConcurrentHashMap
採用鎖分段的技術,默認在集合內部維護了16把鎖,每幾個Bucket
做爲一個組,每一個組對應一把鎖,這樣最多就能支持16個線程同時訪問Map了。每一個Bucket對應一把鎖是吧?sql
HashMap
在併發場景下,它不安全的點是哪裏?緩存
仔細說一下造成環形鏈表的過程。(解析參考)安全
HashMap
在元素個數到達閥值(容量x複雜引子)後會進行擴容,首先新建一個擴容後的空Map,而後遍歷Entry將其Rehash到新的Map上。Rehash(對應方法transfer
)中有一行代碼是Entry next = e.next
,其中e
是當前遍歷到的Entry。假設如今有兩個線程A、B都在Rehash,B遍歷到Entry3剛獲得next(好比Entry2)時就消耗完時間片被掛起了,此時對於B來講e=Entry3,next=Entry2
。這時A搶到CPU執行權,暢通無阻的執行完了Rehash操做:網絡
而後B恢復執行,將Entry3從新哈希到了本身新Map的第3個桶上,而且e=next
指向了Entry2,next=e.next
指向了Entry3,因而將Entry2從新哈希到本身新Map的第3個同上,發現桶裏已有Entry3,因而將Entry3的next指針指向Entry2,這在A中的新Map上表現爲Entry2和Entry3造成了環形鏈表:數據結構
其實我當時答得並不許確……
桶裏底層放的數據結構是怎樣的?
ConcurrentHashMap和HashMap,他們除了一個線程安全一個線程不安全,還有其餘的區別嗎?
看到你項目中寫使用消息中間件實現短信發送功能的請求方和發送短信方之間的解耦,用的是什麼中間件?
若是你發短信,發送失敗了怎麼辦?
那叫你優化的話,你怎麼優化?
因此,具體該怎麼作?請求方將號碼給到mq,短信發送方怎麼作?發送成功了怎麼作、失敗了又怎麼作?ack怎麼作?一套流程,你說個一、二、三、四、5步出來。
不要以爲項目用了不少框架就很厲害,若是面試官問你是否看過源碼、如何排除故障、如何解決故障你卻答不上來,那這個項目就是在給本身埋坑。簡歷上的項目最好寫那種有一些本身思考在裏面的,而不是培訓機構那些填鴨式的項目。
java.lang.Object
,若是沒有雙親委派機制,那麼java.lang.Object
的類加載請求就可能被應用程序類加載器受理,它則會加載咱們自定義的java.lang.Object
從而屏蔽了核心類庫的Object,這樣的話會損害JVMsynchronized
修飾一個類,那麼是否是這個類全部的方法都會加鎖?
synchronized
的語法規則是隻能修飾方法和代碼塊synchronized
修飾靜態方法和實例方法有什麼區別?
synchronized
鎖的膨脹過程是怎樣的?