关注
一、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
相关推荐
halux:hlgg

点赞 评论 收藏
分享
点赞 评论 收藏
分享
04-28 15:42
郑州大学 C++ 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
- 1... AI Agent 面试 Top50 必刷题1.8W
- 2... 看不懂组内文档,实习怎么偷产出?8836
- 3... 解决了xd们,发了个dy曝光视频,十几万播放,直接让他火速联系我,赔我路费了,兄弟们碰到不公平的违法行为,一定要积极捍卫自己权益4628
- 4... 要对实习同事表白吗?4601
- 5... 五月了,感觉实习很难找了4311
- 6... 理性讨论,卷实习算不算工贼行为?4158
- 7... 妈妈只想要你快乐3486
- 8... 三段大厂,说下我见过的最低学历3302
- 9... 26届双非本求职总结3174
- 10... 逆天操作,也是让我遇到了3097
正在热议
更多
# 26届春招投递记录 #
35604次浏览 296人参与
# 你今年的平均薪资是多少? #
229867次浏览 1065人参与
# 27届实习投递记录 #
120021次浏览 1369人参与
# 求职你最看重什么? #
170251次浏览 914人参与
# 如何成为1个AI工程师? #
5472次浏览 273人参与
# 我想象的实习vs现实的实习 #
340632次浏览 2315人参与
# 要毕业了,再不说就来不及了 #
8510次浏览 150人参与
# 硬件人的简历怎么写 #
349564次浏览 3141人参与
# 你在职场上见过哪些“水货”同事 #
41905次浏览 179人参与
# 秋招提前批,你开始投了吗 #
766445次浏览 8495人参与
# 哪些公司校招卡第一学历 #
262369次浏览 879人参与
# 你觉得机械有必要实习吗 #
88991次浏览 536人参与
# 机械人的秋招小目标 #
32918次浏览 251人参与
# 面试被问第一学历差时该怎么回答 #
297056次浏览 2306人参与
# 国庆假期,给大脑放个假 #
26913次浏览 121人参与
# 提名点击就挂的公司 #
146590次浏览 494人参与
# AI面会问哪些问题? #
136307次浏览 3634人参与
# 秋招想进国企该如何准备 #
150478次浏览 693人参与
# 机械人,你的秋招第一份简历被谁挂了 #
272469次浏览 2455人参与
# 携程笔试 #
179762次浏览 926人参与

