一面
hashmap的實(shí)現(xiàn)原理尿贫,多線程并發(fā)操作hashmap會(huì)有什么問題?
原理簡述:使用數(shù)組加鏈表的數(shù)據(jù)結(jié)構(gòu),根據(jù)給出的key -hash到數(shù)組的一個(gè)下標(biāo)踏揣,如果當(dāng)前下標(biāo)有值建立一個(gè)鏈表 指向next庆亡, 注意的是新插入的值會(huì)在頭鏈表上, 這樣的設(shè)計(jì)思路是 新數(shù)據(jù)默認(rèn)更熱
發(fā)產(chǎn)生的問題:多線程put后可能導(dǎo)致get死循環(huán)
多線程put的時(shí)候可能導(dǎo)致元素丟失
主要問題出在addEntry方法的new Entry (hash, key, value, e)捞稿,如果兩個(gè)線程都同時(shí)取得了e,則他們下一個(gè)元素都是e又谋,然后賦值給table元素的時(shí)候有一個(gè)成功有一個(gè)丟失。
put非null元素后get出來的卻是null
泛型的反射擦除
- 泛型只在編譯期有效娱局,在運(yùn)行期會(huì)被擦除掉彰亥, 所以通過反射的反射往一個(gè)要求泛型的集合添加對象,逃過了編譯器的檢查衰齐,
是可以正常在運(yùn)行期使用的
樂觀鎖了解哪些
1任斋、CAS(Compare And Swap) JAVA中實(shí)現(xiàn)了
AtomicBoolean、AtomicLong耻涛、AtomicReference, 缺點(diǎn)是
-在并發(fā)沖突概率大的高競爭環(huán)境下仁卷,如果CAS一直失敗,會(huì)一直重試犬第,CPU開銷較大锦积。針對這個(gè)問題的一個(gè)思路是引入退出機(jī)制,如重試次數(shù)超過一定閾值后失敗退出歉嗓。當(dāng)然丰介,更重要的是避免在高競爭環(huán)境下使用樂觀鎖。
2、版本號(hào)機(jī)制 如數(shù)據(jù)庫加加入時(shí)間戳
嚴(yán)格來講CAS不是一種鎖 是一種概念上的鎖
B+樹和紅黑樹時(shí)間復(fù)雜度
二叉樹的遍歷
前序遍歷:根左右
中序遍歷:左根右
后續(xù)遍歷:左右根
算法-java
public void theFirstTraversal(Node node){
printNode(node);
if(node.getLeftNode()!=null){
theFirstTraversal(node.getLeftNode());
}
if(node.getRightNode()!=null){
theFirstTraversal(node.getRightNode());
}
}
public void thePostOrderTraversal(Node node){
if(node.getLeftNode()!=null){
thePostOrderTraversal(node.getLeftNode());
}
if(node.getRightNode()!=null){
thePostOrderTraversal(node.getRightNode());
}
printNode(node);
}
public void theInOrderTraversal(Node node){
if(node.getLeftNode()!=null){
theInOrderTraversal(node.getLeftNode());
}
printNode(node);
if(node.getRightNode()!=null){
theInOrderTraversal(node.getRightNode());
}
}
快排的時(shí)間復(fù)雜度哮幢,冒泡時(shí)間復(fù)雜度带膀,快排是否穩(wěn)定,快排的過程
講一下spring的啟動(dòng)流程
spring啟動(dòng)有幾種方法橙垢,通過web.xml的監(jiān)聽器垛叨,或者ClassPathXmlApplicationContext,
FileSystemXmlApplicationContext柜某,它啟動(dòng)的核心目標(biāo)是構(gòu)建spring容器嗽元,構(gòu)建容器需要做以下幾個(gè)工作 ,實(shí)例化對象喂击,
加載配置剂癌,裝配bean對象,
首先根據(jù)路徑加載配置文件翰绊,也叫元數(shù)據(jù) 和pojo對象, 根據(jù)對應(yīng)的模板表情進(jìn)行初始化操作佩谷,通過元數(shù)據(jù)和反射的方式生成對象放入容器中,load的配置也進(jìn)行初始化监嗜,后面會(huì)有bean的裝配工作和回調(diào)工作谐檀,
比如實(shí)現(xiàn)了InitializingBean 會(huì)在容器所有需要設(shè)置屬性的bean設(shè)置完以后調(diào)用afterPropertiesSet
this.postProcessBeanFactory(beanFactory);
this.invokeBeanFactoryPostProcessors(beanFactory);
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory);
this.finishRefresh();
AOP是怎么實(shí)現(xiàn)的?兩種動(dòng)態(tài)代理的應(yīng)用場景裁奇?
通過動(dòng)態(tài)生成字節(jié)碼稚补,增強(qiáng)代碼業(yè)務(wù)功能,
JDK動(dòng)態(tài)代理框喳, 需要代理的類必須要實(shí)現(xiàn)接口
cglib 無需實(shí)現(xiàn)接口 速度快
javaassist 也無需實(shí)現(xiàn)接口
Java中的新生代和老年代的垃圾回收算法课幕,對應(yīng)的垃圾收集器
https://www.cnblogs.com/wrencai/p/5668621.html VC
談?wù)?synchronized、ReenTrantLock五垮、volatile 三者的區(qū)別
synchronized 互斥鎖乍惊,
即操作互斥,并發(fā)線程過來放仗,串行獲得鎖润绎,串行執(zhí)行代碼。就像一個(gè)房間一把鑰匙诞挨,一個(gè)人進(jìn)去后莉撇,下一個(gè)人得等第一個(gè)人出來得到鑰匙才能進(jìn)入。如果代碼寫的不好(A)惶傻,可能出現(xiàn)死鎖9骼伞(A得到鎖,B等待A釋放鎖银室,A不釋放涂佃,B死鎖).
ReenTrantLock 重入鎖
在JDK優(yōu)化之后 synchronized 和reentrantLCOK 鎖的性能其實(shí)差不多
唯一的區(qū)別是
ReenTrantLock可以指定是公平鎖還是非公平鎖励翼。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的線程先獲得鎖辜荠。
ReenTrantLock提供了一個(gè)Condition(條件)類汽抚,用來實(shí)現(xiàn)分組喚醒需要喚醒的線程們,而不是像synchronized要么隨機(jī)喚醒一個(gè)線程要么喚醒全部線程伯病。
ReenTrantLock提供了一種能夠中斷等待鎖的線程的機(jī)制造烁,通過lock.lockInterruptibly()來實(shí)現(xiàn)這個(gè)機(jī)制。
如果需要使用reentrantlock的這三種獨(dú)立功能可以使用這個(gè)鎖 并且ReenTrantLock的力度更細(xì)
volatile 是一個(gè)關(guān)鍵字 對虛擬機(jī)聲明標(biāo)識(shí)有該關(guān)鍵字的遍歷 不允許重排序和修改馬上刷新內(nèi)存~
示例代碼:
二面
[Linux]命令 統(tǒng)計(jì)午笛,排序惭蟋,前幾問題等
wc、sort季研、uniq這三個(gè)命令都是用于排序。
wc命令很簡單誉察,在linux中用來統(tǒng)計(jì)文件中的字節(jié)數(shù)与涡、字?jǐn)?shù)、行數(shù)持偏,并且將結(jié)果返回
格式:wc [-clmwL] file
-c:統(tǒng)計(jì)字節(jié)數(shù)
-l:統(tǒng)計(jì)行數(shù)
-m:統(tǒng)計(jì)字符數(shù)
-w:統(tǒng)計(jì)字?jǐn)?shù)驼卖,一個(gè)字被定義為由空白、跳格或換行字符分隔的字符串
-L:打印最長行的長度
https://blog.csdn.net/feng973/article/details/73849586
full gc的發(fā)生有哪幾種情況鸿秆?
觸發(fā)MinorGC(Young GC)
虛擬機(jī)在進(jìn)行minorGC之前會(huì)判斷老年代最大的可用連續(xù)空間是否大于新生代的所有對象總空間
1酌畜、如果大于的話,直接執(zhí)行minorGC
2卿叽、如果小于桥胞,判斷是否開啟HandlerPromotionFailure,沒有開啟直接FullGC
3考婴、如果開啟了HanlerPromotionFailure, JVM會(huì)判斷老年代的最大連續(xù)內(nèi)存空間是否大于歷次晉升的大小贩虾,如果小于直接執(zhí)行FullGC
4、如果大于的話沥阱,執(zhí)行minorGC
觸發(fā)FullGC
- 老年代空間不足 如果創(chuàng)建一個(gè)大對象缎罢,Eden區(qū)域當(dāng)中放不下這個(gè)大對象,會(huì)直接保存在老年代當(dāng)中考杉,如果老年代空間也不足策精,就會(huì)觸發(fā)Full GC。為了避免這種情況崇棠,最好就是不要?jiǎng)?chuàng)建太大的對象咽袜。
- 持久代空間不足
如果有持久代空間的話,系統(tǒng)當(dāng)中需要加載的類枕稀,調(diào)用的方法很多酬蹋,同時(shí)持久代當(dāng)中沒有足夠的空間及老,就出觸發(fā)一次Full GC - YGC出現(xiàn)promotion failure
promotion failure發(fā)生在Young GC, 如果Survivor區(qū)當(dāng)中存活對象的年齡達(dá)到了設(shè)定值,會(huì)就將Survivor區(qū)當(dāng)中的對象拷貝到老年代范抓,如果老年代的空間不足骄恶,就會(huì)發(fā)生promotion failure, 接下去就會(huì)發(fā)生Full GC. - 統(tǒng)計(jì)YGC發(fā)生時(shí)晉升到老年代的平均總大小大于老年代的空閑空間
在發(fā)生YGC是會(huì)判斷匕垫,是否安全僧鲁,這里的安全指的是,當(dāng)前老年代空間可以容納YGC晉升的對象的平均大小象泵,如果不安全寞秃,就不會(huì)執(zhí)行YGC,轉(zhuǎn)而執(zhí)行Full GC。 - 顯示調(diào)用System.gc
Netty內(nèi)部結(jié)構(gòu)
mysql有幾種引擎偶惠,區(qū)別春寿?
1.常用的3種
2.InnoDB Myisam Memory
3.InnoDB跟Myisam的默認(rèn)索引是B+tree,Memory的默認(rèn)索引是hash
區(qū)別:
1.InnoDB支持事務(wù)忽孽,支持外鍵绑改,支持行鎖,寫入數(shù)據(jù)時(shí)操作快兄一,MySQL5.6版本以上才支持全文索引
2.Myisam不支持事務(wù)厘线。不支持外鍵,支持表鎖出革,支持全文索引造壮,讀取數(shù)據(jù)快
3.Memory所有的數(shù)據(jù)都保留在內(nèi)存中,不需要進(jìn)行磁盤的IO所以讀取的速度很快, 、
但是一旦關(guān)機(jī)的話表的結(jié)構(gòu)會(huì)保留但是數(shù)據(jù)就會(huì)丟失,表支持Hash索引骂束,因此查找速度很快
innodb中聚集索引耳璧,非聚集索引
MySQL、Redis展箱、MongoDB各自的應(yīng)用場景
分布式下redis如何保證線程安全
Redis的存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)楞抡,以及持久化區(qū)別
https://www.cnblogs.com/neooelric/p/9621736.html
Redis 提供了多種不同級(jí)別的持久化方式:
RDB 持久化可以在指定的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的時(shí)間點(diǎn)快照(point-in-time snapshot)。
AOF 持久化記錄服務(wù)器執(zhí)行的所有寫操作命令析藕,并在服務(wù)器啟動(dòng)時(shí)召廷,通過重新執(zhí)行這些命令來還原數(shù)據(jù)集。AOF 文件中的命令全部以 Redis 協(xié)議的格式來保存账胧,新命令會(huì)被追加到文件的末尾竞慢。Redis 還可以在后臺(tái)對 AOF 文件進(jìn)行重寫(rewrite),使得 AOF 文件的體積不會(huì)超出保存數(shù)據(jù)集狀態(tài)所需的實(shí)際大小治泥。
Redis 還可以同時(shí)使用 AOF 持久化和 RDB 持久化筹煮。在這種情況下,當(dāng) Redis 重啟時(shí)居夹,它會(huì)優(yōu)先使用 AOF 文件來還原數(shù)據(jù)集败潦,因?yàn)?AOF 文件保存的數(shù)據(jù)集通常比 RDB 文件所保存的數(shù)據(jù)集更完整本冲。
你甚至可以關(guān)閉持久化功能,讓數(shù)據(jù)只在服務(wù)器運(yùn)行時(shí)存在劫扒。
了解 RDB 持久化和 AOF 持久化之間的異同是非常重要的檬洞,以下幾個(gè)小節(jié)將詳細(xì)地介紹這這兩種持久化功能,并對它們的相同和
三面
什么情況索引不會(huì)命中沟饥,會(huì)造成全表掃描
1.應(yīng)盡量避免在 where 子句中對字段進(jìn)行 null 值判斷添怔,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:
- 應(yīng)盡量避免在 where 子句中使用!=或<>操作符贤旷,否則將引擎放棄使用索引而進(jìn)行全表掃描广料。
3.應(yīng)盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描幼驶,如:
4.in 和 not in 也要慎用艾杏,否則會(huì)導(dǎo)致全表掃描
5.'%abc%' like全匹配查詢也會(huì)導(dǎo)致
6.應(yīng)盡量避免在where子句中對字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
JVM性能調(diào)優(yōu)會(huì)涉及哪些參數(shù)?
Restful盅藻、SOAP购桑、RPC、SOA萧求、微服務(wù)之間的區(qū)別
SpringClound與Dubbo的比較其兴,優(yōu)劣勢
kafka和rockMQ區(qū)別
https://www.cnblogs.com/ynyhl/p/11320797.html 詳情
rockMq4個(gè)組成部門
name servers- 一個(gè)輕量級(jí)路由和發(fā)現(xiàn)服務(wù)顶瞒,類似于zookpeer,提供了通信讀寫服務(wù) 支持快速純粹和擴(kuò)張
brokers-是用來存儲(chǔ)消息數(shù)據(jù)夸政,通過topic和queue機(jī)制,同時(shí)支持拉和推模式榴徐,支持故障容忍機(jī)制(數(shù)據(jù)復(fù)制多份)支持萬億級(jí)別的數(shù)據(jù)聚合和有序隊(duì)列守问,同時(shí)支持災(zāi)難恢復(fù),強(qiáng)大的數(shù)據(jù)統(tǒng)計(jì)和警功能這都是傳統(tǒng)的消息隊(duì)列缺少的
producers- 支持分布式部署坑资,producers通過負(fù)載均衡機(jī)制發(fā)送消息給broken耗帕,低延遲
consumers- 支持分布式部署(推和拉兩種拉取數(shù)據(jù)模式),同時(shí)支持集群消費(fèi)和消息廣播功能 -(廣播就是向一個(gè)主題的所有訂閱者發(fā)送同一條消息袱贮。在發(fā)送消息的時(shí)候和普通的消息并與不同之處仿便,只是在消費(fèi)端做一些配置即可)
mysql如何實(shí)現(xiàn)如何實(shí)現(xiàn)分庫分表+動(dòng)態(tài)數(shù)據(jù)源+讀寫分離
什么是緩存雪崩?服務(wù)器雪崩的場景與解決方案
分布式鎖的方案攒巍,redis和zookeeper哪個(gè)好嗽仪,如果是集群部署,高并發(fā)情況下哪個(gè)性能更好柒莉。
請畫一個(gè)大型網(wǎng)站分布式集群部署圖
秒殺系統(tǒng)的架構(gòu)設(shè)計(jì)