偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一次“面試翻車”后的思考:HashMap 和 ConcurrentHashMap 的區(qū)別到底在哪里?

開發(fā) 前端
在單線程中,HashMap 這個(gè)"菜單"工作得很好。但到了多線程環(huán)境中,問(wèn)題就來(lái)了:它本身不是線程安全的,多個(gè)線程同時(shí)操作會(huì)導(dǎo)致數(shù)據(jù)不一致。

引言

嘿,大家好,我是小米,一個(gè)愛(ài)研究技術(shù)、也愛(ài)講故事的 29 歲大哥哥。

上周我接了一個(gè)社招面試,面試官直接拋過(guò)來(lái)一個(gè)問(wèn)題:“說(shuō)說(shuō) Java 里的 HashMap 和 ConcurrentHashMap 有什么區(qū)別?”我心里一緊,心想這不是基礎(chǔ)題嘛,結(jié)果我開口解釋了半天,面試官的眼神卻越來(lái)越微妙……嗯,這次面試翻車了。

所以,今天我決定好好梳理一下 HashMap 和 ConcurrentHashMap 的區(qū)別,希望我的教訓(xùn)能幫到大家!

開場(chǎng)故事:為什么需要 ConcurrentHashMap?

先想象一個(gè)場(chǎng)景:你和朋友們?cè)诓蛷d點(diǎn)菜,每個(gè)人都可以隨時(shí)往菜單里加菜。

問(wèn)題來(lái)了:如果兩個(gè)人同時(shí)修改菜單,服務(wù)員可能會(huì)拿到一份有問(wèn)題的訂單,比如一道菜被重復(fù)記錄,或者有的菜根本沒(méi)加上。

在單線程中,HashMap 這個(gè)"菜單"工作得很好。但到了多線程環(huán)境中,問(wèn)題就來(lái)了:它本身不是線程安全的,多個(gè)線程同時(shí)操作會(huì)導(dǎo)致數(shù)據(jù)不一致。

于是,Java 提供了一個(gè)改進(jìn)版的“菜單”——ConcurrentHashMap。不僅線程安全,還能保持一定的性能。

第一回合:結(jié)構(gòu)上的對(duì)比

1. HashMap 的結(jié)構(gòu)

HashMap 的底層是由數(shù)組和鏈表組成的,Java 8 以后為了提升性能,又在鏈表長(zhǎng)度超過(guò)一定閾值時(shí)將鏈表轉(zhuǎn)換為紅黑樹。

它的默認(rèn)容量是 16,每次擴(kuò)容時(shí)會(huì)翻倍到 32、64……以此類推。

2. ConcurrentHashMap 的結(jié)構(gòu)

ConcurrentHashMap 的設(shè)計(jì)比 HashMap 復(fù)雜得多。Java 7 時(shí),它使用了 Segment 作為分段鎖的機(jī)制。Java 8 之后,Segment 被淘汰,改用了一種基于 CAS(Compare-And-Swap)操作和 Synchronized 鎖的設(shè)計(jì)。

簡(jiǎn)單來(lái)說(shuō),ConcurrentHashMap 的核心在于 分段和細(xì)粒度鎖,它的每個(gè)桶(bucket)可以獨(dú)立加鎖,從而提高并發(fā)性能。

第二回合:線程安全的實(shí)現(xiàn)

1. HashMap:線程不安全

HashMap 沒(méi)有任何鎖機(jī)制,完全是無(wú)鎖設(shè)計(jì)。在多線程情況下,最典型的問(wèn)題是死循環(huán),例如兩個(gè)線程同時(shí)觸發(fā)擴(kuò)容操作,導(dǎo)致循環(huán)鏈表形成,程序直接掛掉。

2. ConcurrentHashMap:線程安全

ConcurrentHashMap 使用了鎖分段技術(shù)來(lái)實(shí)現(xiàn)線程安全:

  • 讀操作:在大多數(shù)情況下是無(wú)鎖的,因?yàn)樗褂昧?volatile 修飾來(lái)保證可見(jiàn)性。
  • 寫操作:通過(guò) CAS 操作和 Synchronized 來(lái)保證線程安全。

另外,它還有一個(gè)巧妙的設(shè)計(jì):分段鎖(Segmented Lock)。每個(gè)桶對(duì)應(yīng)一個(gè)鎖,多個(gè)線程可以同時(shí)操作不同的桶,避免了全表加鎖的性能損耗。

第三回合:性能的對(duì)比

HashMap 的性能很高,因?yàn)樗緵](méi)有鎖,單線程環(huán)境下表現(xiàn)優(yōu)秀。但在多線程環(huán)境中會(huì)產(chǎn)生數(shù)據(jù)不一致的問(wèn)題。

ConcurrentHashMap 引入了鎖機(jī)制,多線程安全性大大提高,但性能上會(huì)稍遜于 HashMap。不過(guò),Java 8 的優(yōu)化讓它在高并發(fā)環(huán)境中表現(xiàn)得非常高效。

第四回合:API 的使用差異

其實(shí)從使用層面來(lái)看,HashMap 和 ConcurrentHashMap 的 API 非常相似。

HashMap 的常用方法:

  • put(K key, V value)
  • get(Object key)
  • remove(Object key)

ConcurrentHashMap 的特有方法:

  • putIfAbsent(K key, V value):只有當(dāng) key 不存在時(shí)才插入。
  • compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction):對(duì) key 對(duì)應(yīng)的值進(jìn)行重新計(jì)算。
  • merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction):如果 key 已存在,就用新的 value 與舊值進(jìn)行合并。

這些增強(qiáng)版方法尤其適合在并發(fā)場(chǎng)景中使用。

面試總結(jié):如果再遇到這個(gè)問(wèn)題,我會(huì)怎么回答?

“HashMap 和 ConcurrentHashMap 的區(qū)別可以從以下幾個(gè)方面來(lái)看:”

1、線程安全性:

  • HashMap 是線程不安全的,在多線程環(huán)境中不能直接使用。
  • ConcurrentHashMap 是線程安全的,通過(guò)分段鎖和 CAS 實(shí)現(xiàn)高效并發(fā)。

2、底層結(jié)構(gòu):

  • HashMap 使用數(shù)組+鏈表/紅黑樹。
  • ConcurrentHashMap 使用分段結(jié)構(gòu),每個(gè)桶獨(dú)立加鎖。

3、并發(fā)性能:

  • HashMap 在單線程環(huán)境中性能最佳。
  • ConcurrentHashMap 在多線程環(huán)境中表現(xiàn)優(yōu)異,尤其適合高并發(fā)場(chǎng)景。

4、API 支持:

  • ConcurrentHashMap 增強(qiáng)了線程安全的 API,如 putIfAbsent、compute 和 merge。

結(jié)尾感悟:面試翻車也是成長(zhǎng)的機(jī)會(huì)

雖然那次面試沒(méi)通過(guò),但這個(gè)問(wèn)題讓我有了更深的認(rèn)識(shí),也提醒我:技術(shù)上的基礎(chǔ)知識(shí)不能掉以輕心。

責(zé)任編輯:武曉燕 來(lái)源: 軟件求生
相關(guān)推薦

2010-08-09 09:09:36

Linux與BSD的區(qū)

2017-03-16 14:31:11

2015-06-30 14:33:52

物聯(lián)網(wǎng)

2015-08-26 08:41:19

物聯(lián)網(wǎng)

2012-04-27 10:13:08

云計(jì)算數(shù)據(jù)IaaS

2015-07-17 10:05:03

面試思考

2019-01-21 07:53:11

路由器IP地址無(wú)線網(wǎng)關(guān)

2018-09-14 08:28:14

數(shù)據(jù)中心廠商供應(yīng)商

2019-01-16 09:20:42

架構(gòu)設(shè)計(jì)JVM FullGC宕機(jī)事故

2024-11-05 09:32:47

2021-11-16 23:07:59

手機(jī)性能技術(shù)

2019-11-04 10:37:53

MongoDB宕機(jī)日志

2018-12-27 09:09:35

2022-03-28 13:14:19

機(jī)器學(xué)習(xí)深度學(xué)習(xí)

2024-09-20 10:02:12

2015-09-02 09:56:33

大數(shù)據(jù)

2019-06-19 08:59:52

數(shù)據(jù)庫(kù)死鎖堆棧

2022-11-29 21:26:26

跨域配置

2020-01-18 14:11:13

數(shù)據(jù)庫(kù)線程技術(shù)

2022-09-13 14:44:40

HashMap哈希表紅黑樹
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)