JDK基礎
Java集合類數據庫結構红柱,HashMap ConcurrentHashMap HashMap擴容的實現方式承匣。
熟悉并發(fā)包工具的使用,和實現原理锤悄。
CountDownLatch韧骗、Semaphore和CyclicBarrier
AtomicStampedReference
http://www.reibang.com/p/bb5105303d85
volatile關鍵字的作用。
線程安全的條件零聚。
樂觀鎖 悲觀鎖 可重用鎖 公平鎖 非公平鎖袍暴。ReentrantLock是如何實現可重復性的,synchronized實現原理些侍,偏心鎖的實現方式,輕量級鎖政模,重量級鎖岗宣。
AQS實現原理 。
AQS是一個抽象類淋样,內部定義了線程狀態(tài)耗式、同步現場隊列、嘗試獲取工作線程趁猴、釋放阻塞線程等模板方法纽什,用戶可以自定義tryAcquire()和tryRelease()方法實現對線程的控制,來定義線程安全組件躲叼。阻塞的線程會在同步隊列進行自旋操作芦缰。
- Java8的新特性。
a. 接口中增加default方法的定義枫慷;
b. 新增Lambda表達式的支持让蕾;
c. 支持函數式接口編程(只有一個抽象方法定義的接口);
d. 支持Stream流式操作或听;
e. 新增Optional對空指針的處理探孝;
f. 對時間處理的增強。Java8中新增的LocalDate,LocalTime,LocalDateTime是不可變類誉裆,是線程安全的顿颅,對應JDBC中的類型為date,time,timestamp。原始的Date和SimpleDateFormat都是線程不安全的足丢。
- JDK中rt.jar java.util.concurrent.ThreadPollExecutor和Executors解讀粱腻。
線程池構造函數參數
通過Executors構建的幾款線程池
- 線程池線程超限時4種處理策略。
AbortPolicy:直接拋棄斩跌,并拋出異常绍些;
CallerRunsPolicy:使用調用者所在的線程運行任務;
DiscardOldestPolicy:丟棄任務隊列中的最后一個任務耀鸦,并執(zhí)行當前任務柬批;
DisCardPolicy:直接拋棄,不執(zhí)行袖订。
*也可以自己實現RejectedExceptionHandler自定義處理策略氮帐,如:任務持久化,記錄日志等洛姑。
Executor實現原理
- JDK原子類是如何處理并發(fā)問題的上沐?
原子類通過各CPU指令提供的CAS(compare and swarp)鎖,保證比較和交換是同一個原子操作吏口,通過volatile關鍵字修飾變量值奄容,保證其他線程修改內存值,本線程副本的可見性产徊,每次通過傳入內存值昂勒,期望交換值調用native方法compareAndSwarp進行比較,如果內存值和副本不一致舟铜,則返回false戈盈,重新拉去最新的內存值進行重試,直到一致進行交換谆刨。
- Lock對比Synchonized的優(yōu)缺點塘娶。
失去了隱士獲取或釋放鎖的便捷性,但卻擁有了鎖獲取與釋放的可操作性痊夭、可中斷的獲取鎖以及超時獲取鎖等多種synchronized關鍵字所不具備的同步特性刁岸。
- 為什么重寫equals方法,一定要重寫hashcode方法她我?
首先要明確equals成功的4個必要性(自反性虹曙、對稱性、傳遞性番舆、一致性)酝碳。重寫equals方法,即不在按照Object默認的對象比較方法進行對象比較恨狈,按照自己的方式實現疏哗。如果此時不進行hashcode的重寫,當對象使用散列集合時禾怠,由于集合在put方法中使用了hashcode的來比較對象的相同性返奉,即在比較前先驗證對象hashcode是否相同,不相同則直接認為不是同一個對象吗氏。此時按照用戶自定義的equals方法是同一個對象衡瓶,而在使用集合時因為未重寫hashcode方法導致對象重復問題等出現。
JVM
- 內存模型牲证,各模塊作用哮针。
堆,虛擬機棧坦袍,程序計數器十厢,方法區(qū),常量池捂齐,本地方法區(qū)
- 垃圾回收算法蛮放。
標記清除,標記整理
關鍵詞:minor gc full gc 引用計數法 可達性檢測
- 強引用奠宜、軟引用包颁、弱引用瞻想、虛引用;弱引用在ThreadLocal的引用娩嚼,為什么使用弱引用蘑险,ThreadLocal在使用時存在的問題,需要注意什么岳悟?使用不當存在內存泄漏的風險佃迄。
- 垃圾回收器有哪些?CMS贵少,G1
CMS是作用于老年代呵俏,需要配合其他年輕代回收算法使用,存在初始標記滔灶、并發(fā)標記普碎、重復標記、并發(fā)清除幾個步驟录平。具有效率高/停頓時間短的特點随常,但是會存在產生內存碎片的問題,當老年代無法分配由年輕代進階的整塊內存時萄涯,會出發(fā)fullGC绪氛。當然可以通知JVM配置,定期對內存碎片進行整理涝影。
G1是基于全堆的回收算法枣察,把堆分成若干Region,使用標記整理和復制算法對內存回收燃逻、整理序目。實現步驟和CMS類似,但是只有并發(fā)標記階段是并行的伯襟。
- 如何分析線上的OOM問題猿涨?
jps jstack jstat jhat jmap
- 類加載的過程,類加載器有哪些姆怪,什么是雙親委派模型叛赚?
啟動類加載器,擴張類加載器稽揭,應用類加載器(系統(tǒng)類加載器)俺附,用戶自定義類加載器 。
什么是雙親委派模型溪掀?雙親委派模型表示的啟動類加載器事镣、系統(tǒng)類加載器、應用程序類加載器揪胃、用戶自定義類加載器之前的層級關系璃哟,除了啟動類加載器外氛琢,都需要有自己父類加載器,并優(yōu)先使用父類加載器随闪,在父類加載器未找到對應類時阳似,才會調用子類加載器加載。其中父子關系是基于組合復用來完成蕴掏。
為什么要使用雙親委派模型:使Java類隨加載器一樣,保證優(yōu)先級的層級關系调鲸,避免相同類限定名不同類的情況的出現盛杰。
- 類加載機制。
類的生命周期:加載—>驗證—>準備—>解析—>初始化—>使用—>卸載 其中驗證藐石、準備即供、解析被稱作連接階段。
如何實現一個類加載器:繼承java.lang.ClassLoader抽象類于微,實現loadClass方法逗嫡。
數據庫
- 數據庫事務隔離級別(未提交、讀已提交株依、可重復讀驱证、串行化),和臟讀恋腕,不可重復讀抹锄,幻讀之間的關系。mysql在InnoDB下的默認隔離級別是可重復讀
事務隔離級別
a.臟讀: 臟讀就是指當一個事務正在訪問數據荠藤,并且對數據進行了修改伙单,而這種修改還沒有提交到數據庫中,這時哈肖,另外一個事務也訪問這個數據吻育,然后使用了這個數據。
b. 不可重復讀:是指在一個事務內淤井,多次讀同一數據布疼。在這個事務還沒有結束時,另外一個事務也訪問該同一數據币狠。那么缎除,在第一個事務中的兩次讀數據之間,由于第二個事務的修改总寻,那么第一個事務兩次讀到的的數據可能是不一樣的器罐。這樣就發(fā)生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重復讀渐行。
c.幻讀:第一個事務對一個表中的數據進行了修改轰坊,這種修改涉及到表中的全部數據行铸董。同時,第二個事務也修改這個表中的數據肴沫,這種修改是向表中插入一行新數據粟害。那么,以后就會發(fā)生操作第一個事務的用戶發(fā)現表中還有沒有修改的數據行颤芬,就好象發(fā)生了幻覺一樣悲幅。
mysql時如何實現事務的?實現原理站蝠。
mysql有哪些鎖汰具,行級鎖的作用對象是什么,生效條件菱魔?
InnoDB支持表級別鎖和行級鎖留荔,行級鎖加載單行數據,只有通過索引字段檢索出的行才會加鎖澜倦。
- 常用的SQL優(yōu)化方案有哪些聚蝶?
a.在連表查詢的時候盡量用數據量小的表作為主表;提前縮小要查詢數據的范圍藻治,提前分頁碘勉;
b.選擇合適的查詢原語;
c.建立合適的索引桩卵,并使用之加快查詢效率恰聘,必要時可以指定查詢使用的索引FORCE INDEX(索引名稱)。建立覆蓋索引吸占,減少回查次數晴叨;
數據庫索引為什么有左偏性,什么是聚簇索引矾屯,什么是非聚簇索引兼蕊?
mysql數據庫的myisam和innodb有什么區(qū)別?
InonDB和myIsam對比
Spring
- IoC原理件蚕。
是一種設計思想孙技,將原本對象與對象的相互依賴轉變成對象和容器的依賴,起到降低耦合的作用排作。由容器來管理對象的創(chuàng)建牵啦、實例化、依賴等工作妄痪。
- AOP原理哈雏,實現方式。
- 描述SpringMVC處理請求的內部實現。
SpringMVC實現原理
- IoC容器的功能裳瘪,BeanFactory和ApplicationConttext的區(qū)別土浸。
IoC解析配置加載杀赢,實例化Bean丐吓,并維護Bean之間的依賴關系凑术,管理Bean的生命周期秦驯。
a. ApplicationContext集成自BeanFactory,是BeanFactory的加強版录语,在其基礎上添加對芭逝,國際化支持荡灾,支持統(tǒng)一的資源文件讀取方式毡惜;
b. ApplicationContext是在容器啟動的時候將所有的Bean實例化拓轻,能更早的發(fā)現容器配置的錯誤,但是更加占用內存虱黄,啟動更加耗時悦即,BeanFactory采用延遲加載來注入Bean吮成;
c. ApplicationContext和BeanFactory都支持BeanPostProcessor/BeanFactoryPostProcessor橱乱,不同的是前者自動注冊,后者需要手動注冊粱甫。
- Spring中bean的生命周期泳叠。
和Servlet的實例化instantiation、初始化init茶宵、接收請求service危纫、銷毀destroy。
a. 實例化Bean乌庶;
b. 設置屬性;
c. 調用Aware方法种蝶;
setBeanNameAware();
setFactoryNameAware();
setApplicationNameAware();
d. 調用自定義的PostProcessor方法,進行前置處理瞒大;(傳遞Bean對象)
e. 調用InitializingBean的afterPropertiesSet和init-method螃征,完成后續(xù)處理;(未傳入Bean對象)
f. 使用Bean透敌;
g. 銷毀Bean盯滚,調用destroy-method方法
- spring bean scope。
singleton prototype request session global-session
- Spring是如何解決循環(huán)依賴的酗电?
構造注入和prototype是無法解決循環(huán)依賴的魄藕。
a. bean創(chuàng)建中的對象放入緩存beanFactory中,在出現循環(huán)依賴時撵术,直接從緩存中取出創(chuàng)建中的對象背率;
b. 完成屬性填充。
- Spring中常見的設計模式。
工廠模式 : BeanFactory
裝飾器模式: BeanWrapper
代理模式: AopProxy
單例模式: ApplicationContext
委派模式: DispatcherServlet
策略模式: HandlerMapping
適配器模式: HandlerApdapter
模板方法模式: JdbcTemplate
觀察者模式: ContextLoaderListener
- springboot starter實現方式退渗。
依賴spring-boot-autoconfigure/spring-boot-configuration-processor
a. jar包依賴
b. 創(chuàng)建properties移稳,添加配置項目和默認配置
c. 創(chuàng)建configuration類加載properties
d. 創(chuàng)建factories文件,開啟configoration
- SpringBoot2有哪些新特性会油?
a. 基于Java8/Java9个粱;
b. 響應式編程,引入了Spring WebFlux 翻翩,WebFlux是一款非阻塞式的函數式編程框架都许,可以用來構建異步的、非阻塞式的嫂冻、事件驅動的服務胶征,具有更好的伸縮性。此框架來源于Spring5桨仿;
c. 開始支持HTTP2.0睛低;
d. 支持 Quartz;
e. 簡化了Secrity的安全配置服傍;
f. 添加了對OAuth2的支持钱雷;
g. 數據庫方面:HikariCP替換了tomcat-pool,提高了DB的訪問速度吹零,擁有更好的性能罩抗;redis默認引入Lettuce,替換了之前的jedis鏈接方式灿椅。
- Spring AOP的實現方式套蒂。
AOP:面向切面編程,是一種通過代理技術在程序編譯期或運行期將外部代碼編制到原代碼中的編程模式茫蛹,以降低程序耦合度操刀,提高代碼重用。
AOP的織入方式:i婴洼、編譯期織入骨坑,如:AspectJ靜態(tài)織入;ii窃蹋、類裝載時織入卡啰;iii、運行期織入警没,在運行期未目標類增強生產子類的方式匈辱,如SpringAOP;
SpringAOP動態(tài)代理技術:JDK動態(tài)代理杀迹,主要使用的是reflect包中的Proxy和InvovationHandler實現亡脸;CGLIB動態(tài)代理:CGLIB是一個高效的代碼生成類庫,使其在目標類不是接口的情況下依然可以實現代理。
SpringAOP實現策略:默認策略是在目標為接口時使用JDK動態(tài)代理浅碾,否則使用CGLIB實現大州;可以通過AopProxyFactory的AdvisedSupport對象配置。
微服務
- 分布式事務的實現策略垂谢。什么CAP原則和BASE理論厦画?
CAP原則:指的是在一個分布式系統(tǒng)中, Consistency(一致性)滥朱、 Availability(可用性)根暑、Partition tolerance(分區(qū)容錯性),三者不可得兼徙邻。
BASE理論:基本可用排嫌、軟狀態(tài)、最終一直性
什么是軟狀態(tài)呢缰犁?相對于原子性而言淳地,要求多個節(jié)點的數據副本都是一致的,這是一種“硬狀態(tài)”帅容。
軟狀態(tài)指的是:允許系統(tǒng)中的數據存在中間狀態(tài)颇象,并認為該狀態(tài)不影響系統(tǒng)的整體可用性,即允許系統(tǒng)在多個不同節(jié)點的數據副本存在數據延時丰嘉。
- TX-LCN的事實現原理夯到。
官網原理圖
正常事務時序圖
異常事務時序圖
理解zk選舉算法的實現原理嚷缭。
分布式鎖的實現方案饮亏,實現原理,redis是如何實現分布式鎖的阅爽?
理解一致性哈希算法路幸。
SpringCloud幾大組件。
注冊中心:eureka
客戶端負載均衡:ribbon
分布式配置中心:config
聲明式服務調用:feign
服務容錯保護:hystrix
API網管:zuul
消息總線:bus
hystrix原理:metrics存儲了各服務狀態(tài)付翁、調用次數简肴、調用失敗次數。服務調用時百侧,檢測是否超時或失敗砰识,和設定的閾值次數、超時時間比較佣渴,確定服務是否需要熔斷辫狼,是否需要打開熔斷開關,并更新服務狀態(tài)辛润。當熔斷器處于打開狀態(tài)時膨处,會按照設定的休眠時間,對熔斷的服務作failback處理,休眠時間之后真椿,會嘗試請求服務鹃答,如果服務正常則關閉熔斷器狀態(tài),以達到服務容災的功能突硝。
簡述熔斷器滑動窗口的實現方式测摔;涉及的技術觀察者模式和RxJava。
- rockerMQ 的優(yōu)缺點解恰,和其他消息中間件對比避咆。
消息持久化為磁盤文件,支持分布式部署修噪,高可用查库,理論不存在消息丟失情況出現。
- Redis相比memcached有哪些優(yōu)勢黄琼?
a. memcached所有的值均是簡單的字符串樊销,Redis作為其替代者,支持更為豐富的數據類型脏款;
b. Redis的速度比memcached快很多围苫;
c. Redis可以持久化其數據;
d. Redis支持數據的備份撤师,即master-slave模式的數據備份剂府;
e. Redission分布式鎖的實現和原理。
Redis線程模型剃盾。
redis存在哪些問題,如何解決腺占?
緩存數據庫雙寫一致性問題;
緩存擊穿
緩存雪崩
緩存key競爭問題
- RPC調用的原理痒谴。
1-客戶端以本地接口的方式調用服務衰伯;
2-客戶端存根接收到調用后,將方法积蔚、參數組裝成可以網絡傳輸的序列化的二進制消息體意鲸;
3-客戶端通過socket將消息發(fā)送到服務端;
4-服務端存根收到消息體后進行解碼(反序列化)尽爆;
5-根據解碼的消息體調用本地服務怎顾,得到結果后,由服務端存根進行序列化成消息體漱贱;
6-服務端通過socket將消息體發(fā)送給客戶端槐雾;
7-客戶端存根收到消息體后解碼;
8-完成本地RPC調用饱亿。
consul實現原理蚜退。
erurka 的實現原理闰靴,和consul,zookeeper有什么區(qū)別钻注?
rocketMq事務型消息的實現原理蚂且。
事務消息的實現原理
數據結構和算法基礎
- 理解二叉樹、二叉搜索樹(二叉排序樹幅恋,二叉查找樹)杏死、平衡二叉樹AVL、紅黑樹捆交。
https://baijiahao.baidu.com/s?id=1636557496125304849&wfr=spider&for=pc&isFailFlag=1
- 排序算法:冒泡排序淑翼、快速排序、堆排序品追、插入排序玄括、希爾排序實例方式,算法復雜度和空間復雜度肉瓦。
常用排序算法的時間/空間復雜度
BigMap在億級數據的排序問題遭京。
手寫二叉樹的前序、中序泞莉、后序遍歷哪雕。
設計模式
- 設計模式的6大原則。
——開閉原則:對擴展開發(fā)鲫趁,對修改關閉斯嚎;
——里氏代換原則:所有能夠使用基類的地方都可以使用子類代替;
——依賴倒轉原則:依賴于抽象挨厚,不依賴于具體堡僻;
——接口隔離原則
——最少知道原則
——合成復用原則:盡量使用組合復用,少用繼承幽崩。
- 單例模式實現方式:
餓漢方式:構建靜態(tài)屬性苦始,在類加載的時候就進行初始化寞钥,線程安全慌申;
雙重檢測方式;
靜態(tài)內部類方式理郑;
枚舉方式蹄溉。
package com.ljf.demo.singleton;
/**
* 雙重檢查模式,最繁瑣的一種方式
*/
public class DoubleClickSingleton {
// 使用volatile關鍵字是為了禁用指令重排序您炉,保證實例在線程間的可見性
private volatile static DoubleClickSingleton instance;
private DoubleClickSingleton() {
}
public static DoubleClickSingleton getInstance() {
// 提高效率
if (instance != null) {
return instance;
}
synchronized (DoubleClickSingleton.class) {
if (instance != null) {
return instance;
}
return new DoubleClickSingleton();
}
}
}
package com.ljf.demo.singleton;
/**
* 枚舉就是一個典型的單例
*/
public enum EnumSingleton {
INSTANCE("Hello World");
private String name;
EnumSingleton(String name) {
this.name = name;
}
}
package com.ljf.demo.singleton;
public class HungrySingleton {
/**
* 餓漢模式柒爵,在類加載的時候就進行實例化,線程安全
*/
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
package com.ljf.demo.singleton;
/**
* 通過靜態(tài)內部類實例化單例(目前最佳的實現方式)
*/
public class InnerSingleton {
private InnerSingleton() {
}
public static InnerSingleton getInstance() {
return Inner.instance;
}
private static class Inner {
public static InnerSingleton instance = new InnerSingleton();
}
public static void main(String[] args) {
InnerSingleton instance = InnerSingleton.getInstance();
System.out.println("----------->");
}
}
- 熟悉常見的設計模式的實現方式赚爵。
單例模式棉胀、代理模式法瑟、工廠模式、過濾器模式唁奢、觀察者模式霎挟、模版方法模式、狀態(tài)模式麻掸、策略模式酥夭、命令模式、責任鏈模式脊奋、建造者模式
場景分析
- 如何保證緩存和數據庫數據的一致性熬北?
設置緩存有效期;
先刪除緩存诚隙,再修改數據庫讶隐;
先更新數據庫,再刪除緩存久又,存在緩存建立中整份,緩存失效的問題,和緩存刪除失敗問題籽孙。
消息中間件如何保證消息投遞烈评、消費不丟失?從生產者犯建、消費者分別分析讲冠。
描述瀏覽器輸入網址到最終返回頁面所經歷的流程。
- DNS查詢
- TCP連接
- 發(fā)送HTTP請求
- Server處理HTTP請求并返回HTTP報文
- 瀏覽器解析并render頁面
- HTTP連接斷開
- 如何讓系統(tǒng)支持高可用适瓦、高平發(fā)竿开?
a. 擴容服務;
b. 熱點數據設置緩存(注意緩存擊穿和血崩等問題玻熙,緩存一致性解決方案)
c. 增加瀏覽器緩存否彩,使用CDN加速
d. 使用消息中間件異步處理和削峰處理
e. 流量限流處理
f. 服務拆分
- 服務拆封的原則。
降低耦合/提高復用/提高系統(tǒng)開發(fā)部署的效率/優(yōu)化資源整合
其他
- junit 用法嗦随,before,beforeClass,after, afterClass 的執(zhí)行順序列荔。
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass
- Linux 文件系統(tǒng)中如何表示權限的?
r w x 分別表示可讀 可寫 可執(zhí)行 對應數字1 2 4枚尼,通過數字之和表示文件對應的權限贴浙,文件權限共分為三組,左到右分別表示當前用戶對該文件的權限署恍,當前用戶組用戶組對應權限崎溃,所有用戶對應權限。