关注
一、HashMap 与 ConcurrentHashMap 的差异
1. 数据一致性风险:
- 在多线程环境下使用 HashMap 时,由于其缺乏线程安全机制,很容易出现数据不一致的情况。例如,两个线程同时添加相同键值对,后添加的线程可能会覆盖先添加的线程的数据,导致数据丢失或错误。
- ConcurrentHashMap 通过精细的锁策略或无锁算法,如 CAS(Compare And Swap),有效地避免了数据覆盖问题。不同线程可以同时对不同的部分进行操作,只有在操作同一部分数据时才会进行同步,从而保证了数据的一致性。
2. 死循环风险:
- HashMap 在进行扩容等操作时,如果多个线程同时进行修改,可能会因为哈希冲突处理不当而陷入死循环,导致 CPU 占用率飙升。这是因为 HashMap 在扩容时会重新计算哈希值并重新排列元素,这个过程中如果多个线程同时操作,可能会导致链表结构被破坏,形成循环链表。
- ConcurrentHashMap 的内部实现经过精心设计,避免了这种由于并发修改而导致的循环问题。它采用了更高效的并发控制机制,确保在扩容等复杂操作时也能保持数据结构的正确性。
二、ConcurrentHashMap 保证线程安全的方式
1. 使用 CAS 操作:
- 以银行账户管理系统为例,CAS 操作就像是一个原子的“比较并交换”机器。当一个线程想要增加用户余额时,它首先读取当前余额,这相当于获取了一个“预期值”。然后,它计算出要增加的金额后,尝试用新的值去替换旧的值,但在替换之前,它会先检查当前余额是否仍然是之前读取的预期值。如果是,说明没有其他线程在这个期间修改了余额,那么就可以安全地进行替换;如果不是,说明有其他线程已经修改了余额,那么当前线程就需要重新读取最新的余额,并再次尝试增加。
- 这种方式的优点是不需要进行传统的锁操作,避免了线程阻塞和上下文切换带来的开销,从而提高了并发性能。
2. 使用 Synchronized:
- 对于更复杂的操作,如合并两个账户的信息,需要确保多个步骤作为一个整体完成。这时候,ConcurrentHashMap 可能会使用 synchronized 关键字来实现同步。Synchronized 会在代码块级别或方法级别上对共享资源进行加锁,确保在同一时间只有一个线程可以访问这些资源。
- 例如,在合并账户信息时,可能需要先读取两个账户的余额,然后进行计算,最后更新两个账户的余额。这个过程中,如果不进行同步,可能会有其他线程在中间修改了账户余额,导致结果错误。使用 synchronized 可以确保在这个复杂的操作过程中,其他线程无法干扰,从而保证了数据的一致性。
总的来说,ConcurrentHashMap 通过结合 CAS 操作和 synchronized 等技术,在保证线程安全的同时,尽可能地提高了并发性能,适用于多线程环境下对共享数据的高效操作。
查看原帖
1 评论
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 9本秋招后端收获9+offer, 我做对了什么?6319
- 2... 数字马力笔试结果4992
- 3... 秋招能拿多个大厂offer的其实就两种人3560
- 4... 现在是2025年10月27日,由于焦虑无法入睡,有感而发写下了这段文字。回想过去三年(甚至可以说是过去的21年),自己一直都是一个不断自我打碎自我重组自我妥协的过程,面对大的困难大的打击,总是会影响自己的心态,在这个过程中不断的去降低预期,安慰自己说是在保护自己,实际上是不敢对自己抱有太大的希望。高考以一个差强人意的分数考上了985,虽然说知道自己数学考的差的不行(两位数),但是当成绩出现之后仍是惊喜到狂叫。每次回想自己的曾经的成果,都有一种恍惚感,感觉自己努力了,但是却又总觉得差那么一口气,总结一下应该就是差那点心气。但是我也如愿的考上了大家口中的好学校,来了之后成绩也还凑合,但是就是无法保研,专业分流之后更是保研无望,在那之后就开始准备找工作了。但是自己的规划能力又极差无比,根本不知道找工作需要什么技能,记得大二的当时刷了很多力扣,学了很多408,直到大二下才迷途知返,知道自己没努力到正确的方向,开始跟着黑马学java,做了外卖点评,在今年的一月份才成功做完了项目,可是当时一点八股都没有学,也花了两个月速成了八股,在三月份开始投递暑期实习简历。这就是噩梦的开始,在这个过程中我的心气也在不断的消亡,由于学历我还是能获得面试机会的,但是几场面试就将我打回原形,基础不牢项目不好没有实习,各个差的标签打在身上令我羞耻难当,经过几次面试的打击使得我逃避了一段时间,用要准备期中考不想挂科的借口,让自己逃离找实习一段时间。但是五月份之后又开始找实习了(回到现实了),发现已经没什么公司招实习生了,那段时间经常失眠,感叹自己浪费了自己的学历以及过去十几年的努力(心气还是太高了哈哈),觉得自己规划能力好差。但是还是非常感谢华为在最后能给予我一段实习经历,尽管我不优秀,跟同部门实习生的学历越差了十万八千里,但是还是非常感谢收留我(不管大家对他评价如何,我都是非常感激的)。实习对我来说就是一段缓冲期,我仿佛在象牙塔一般。那段日子我身上没有求职的焦虑,虽然说每天也很忙,工作的时候要赶需求,下班之后做项目背八卦刷力扣,但是生活还是充实且规律的,我不再被焦虑所包裹,是这一年里我最快乐的一段日子。九月份回来秋招之后,深感秋招之艰难,可能是因为投的晚,实习产出有限,水平不足,在这段时间不断碰壁,几乎没有什么面试的机会,直到如今也没有任何一个offer。但是每天还是坚持在图书馆学习,近期真的有点泄气了,经历上周十场面试,已燃尽,但是给我带来了一丝希望,已有两家公司进了池子,且有两家公司还在流程中,但是我不敢抱有希望,很怕希望破碎使得我再次破碎,但是心里又渴望那希望。打完这段话准备休息了,焦虑没用但是无法不焦虑,感觉自己能力虽然说不是非常强但是应该也不算特别差吧,但是仍如此艰难,可能不仅仅是自己能力的原因吧,时运,机遇都需要合适。将这段文字写下也不是为了传播焦虑输出我的坏情绪,也是希望看到这段话且能共情我的人,看到这些心里可以好受一些,肯定不止我一个人深陷焦虑中,希望这些心里话能给大家带来一丝安慰!(这算比惨吗不算吧哈哈哈,毕竟我从bg上还是看得过去的吧,但是也是0offer,想想我应该会宽慰一点)-------------分割线-------------2025/10/31 今天拿到了第一个满意的意向,那就暂时休息一下吧,祝所有人如愿。2919
- 5... 27日常实习 字节后端一面凉经2790
- 6... 本硕985文科女秋招 0 offer深夜有感2488
- 7... 真完蛋,我大抵是要毕业即失业了,从数据角度大概能看出26秋招竞争的确过于激烈了。2429
- 8... 双非0offer2097
- 9... 应届生校招进体制机会大盘点2024
- 10... 秋招笔面记录1905
正在热议
更多
# HR问:你期望的薪资是多少?如何回答 #
67706次浏览 653人参与
# 我和mentor的爱恨情仇 #
78291次浏览 431人参与
# “vivo”个offer #
42444次浏览 290人参与
# 打工人的精神状态 #
98981次浏览 1292人参与
# 被同事甩锅了怎么办 #
24535次浏览 100人参与
# 你见过哪些工贼行为 #
30092次浏览 146人参与
# 一人一个landing小技巧 #
126028次浏览 1457人参与
# 你的秋招第一场笔试是哪家 #
259233次浏览 2027人参与
# 满帮集团求职进展汇总 #
7038次浏览 68人参与
# 考研失败就一定是坏事吗? #
150020次浏览 1081人参与
# vivo工作体验 #
29596次浏览 125人参与
# 和mentor 1on1 都聊什么? #
2706次浏览 21人参与
# 哪一瞬间觉得自己长大了 #
39899次浏览 494人参与
# 上班后和你想的一样吗? #
88427次浏览 671人参与
# 校招生月薪1W算什么水平 #
44628次浏览 240人参与
# 实习吐槽大会 #
387045次浏览 2156人参与
# 如何准备秋招 #
65015次浏览 830人参与
# 你想留在一线还是回老家? #
63116次浏览 537人参与
# 工作后明白的那些道理 #
23297次浏览 225人参与
# 数字马力求职进展汇总 #
207313次浏览 1638人参与
# 我是面试官,请用一句话让我破防 #
29594次浏览 136人参与
