鎖屏面試題百日百刷-java大廠八股文(day2)
為了有針對(duì)性的準(zhǔn)備面試,鎖屏面試題百日百刷開始每日從各處收集的面經(jīng)中選擇幾道經(jīng)典面試題分享并給出答案供參考,答案中會(huì)做與題目相關(guān)的擴(kuò)展,并且可能會(huì)拋出一定問(wèn)題供思考。這些題目我會(huì)標(biāo)注具體的公司、招聘類型(校招、社招、實(shí)習(xí))以及面試階段。這些面試題會(huì)收錄到鎖屏面試題app和小程序中并整理歸類好。其他面試題也同樣在持續(xù)更新中,多謝使用和支持。下面是今日面試題:
====HashMap為什么線程不安全?ConcurrentHashMap的原理?[字節(jié)跳動(dòng)][校招][二面]
HashMap不安全的地方:
HashMap在new的時(shí)候并不會(huì)初始化,而是在第一次 put 的時(shí)候,會(huì)進(jìn)行哈希數(shù)組的初始化,如下圖:
?

(resize方法這里不說(shuō),建議去了解下,因?yàn)檫@個(gè)涉及到面試的另一個(gè)常問(wèn)點(diǎn),HashMap的原理。)
要是兩個(gè)線程做put操作,且恰好判斷tab(如上圖)的長(zhǎng)度為空,則會(huì)存在兩次對(duì) HashMap 進(jìn)行初始化,這樣就會(huì)有兩個(gè)哈希數(shù)組。所以說(shuō)線程不安全的。
另外在HashMap中put、remove等方法因?yàn)闆](méi)有添加鎖,也存在線程安全問(wèn)題。
ConcurrentHashMap的原理:
?
在1.8中,ConcurrentHashMap使用數(shù)組+單向鏈表+紅黑樹的數(shù)據(jù)結(jié)構(gòu)保存數(shù)據(jù),采用Node + CAS + Synchronized實(shí)現(xiàn)分段鎖的形式來(lái)保證并發(fā)操作安全進(jìn)行。
?

這里擴(kuò)展講一下ConcurrentHashMap實(shí)現(xiàn)初始化hash表的過(guò)程,其他的put、remove等操作在后面的面試題中遇到再講,感興趣的可以看一看ConcurrentHashMap源碼。
?

如與HashMap中一樣,ConcurrentHashMap也是在put中做初始化hash表的操作,它首先設(shè)置了一個(gè)sizeCtl變量,這個(gè)變量的默認(rèn)值是0,當(dāng)我們做初始化hash表操作時(shí),通過(guò)CAS操作(圖中代碼U.compareAndSwapInt(this, SIZECTL, sc, -1))將其置為-1,然后我們?cè)龠M(jìn)行初始化(初始化完成后,我們需要在 finally 代碼塊中把 sizeCtl 設(shè)置回 0 的值),設(shè)置這個(gè)sizeCtl為-1的原因是所有的線程在判斷hash表為空的時(shí)候,要想初始化hash表得判斷這個(gè)sizeCtl
不小于0,如果小于0說(shuō)明有其他線程在初始化hash表,就會(huì)使用Thread.yield()讓當(dāng)前線程放棄時(shí)間片就算當(dāng)前線程又搶到了時(shí)間片,它還是會(huì)在這個(gè)while中(我們稱為自旋),知道hash表初始化完成,也就不用再進(jìn)行初始化了,while條件也不再成立,但是得注意變量table(hash表)和sizeCtl必須為volatile,保證其可見(jiàn)性。
1.7中,ConcurrentHashMap采用Segment + HashEntry的結(jié)構(gòu),Segment是一種可重入鎖(ReentrantLock),在ConcurrentHashMap里扮演鎖的角色;HashEntry則用于存儲(chǔ)鍵值對(duì)數(shù)據(jù)。一個(gè)ConcurrentHashMap里包含一個(gè)Segment數(shù)組。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu)。一個(gè)Segment里包含一個(gè)HashEntry數(shù)組,每個(gè)HashEntry是一個(gè)鏈表結(jié)構(gòu)的元素,每個(gè)Segment守護(hù)著一個(gè)HashEntry數(shù)組里的元素,當(dāng)對(duì)HashEntry數(shù)組的數(shù)據(jù)進(jìn)行修改時(shí),必須首先獲得與它對(duì)應(yīng)的Segment鎖,如下圖所示。

====講下https?[shopee][校招][一面]
http(Hyper Text Transfer Protocol)協(xié)議是對(duì)客戶端和服務(wù)器端之間數(shù)據(jù)之間實(shí)現(xiàn)可靠性的傳輸文字、圖片、音頻、視頻等超文本數(shù)據(jù)的規(guī)范,格式簡(jiǎn)稱為“超文本傳輸協(xié)議”,http協(xié)議屬于應(yīng)用層。
https實(shí)現(xiàn)的原理:
一、首先HTTP請(qǐng)求服務(wù)端生成證書,客戶端對(duì)證書的有效期、合法性、域名是否與請(qǐng)求的域名一致、證書的公鑰(RSA加密)等進(jìn)行校驗(yàn);
?
二、客戶端如果校驗(yàn)通過(guò)后,就根據(jù)證書的公鑰的有效, 生成隨機(jī)數(shù),隨機(jī)數(shù)使用公鑰進(jìn)行加密(RSA加密);
?
三、消息體產(chǎn)生的后,對(duì)它的摘要進(jìn)行MD5(或者SHA1)算法加密,此時(shí)就得到了RSA簽名;
?
四、發(fā)送給服務(wù)端,此時(shí)只有服務(wù)端(RSA私鑰)能解密。
?
五、解密得到的隨機(jī)數(shù),再用AES加密,作為密鑰(此時(shí)的密鑰只有客戶端和服務(wù)端知道)。
更多面試題或?qū)W習(xí)資源可查看我主頁(yè)或評(píng)論獲取