国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

鎖屏面試題百日百刷-java大廠八股文(day2)

2021-07-26 22:21 作者:zjlala96  | 我要投稿


為了有針對(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)論獲取


鎖屏面試題百日百刷-java大廠八股文(day2)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
开远市| 治多县| 交口县| 洛川县| 大竹县| 洞口县| 江津市| 普宁市| 长汀县| 泰兴市| 玉屏| 万源市| 介休市| 伊通| 华容县| 汾西县| 台江县| 萍乡市| 务川| 体育| 黄梅县| 鄂尔多斯市| 睢宁县| 祥云县| 伊春市| 万源市| 井研县| 洪洞县| 孙吴县| 揭西县| 宁远县| 河南省| 贵港市| 梁平县| 横峰县| 永安市| 石狮市| 秭归县| 松桃| 赤壁市| 龙井市|