关注
一、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 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
03-29 16:05
南京大学 Java 点赞 评论 收藏
分享
牛客热帖
更多
- 1... 实习体验有感,送给学弟学妹3.9W
- 2... 美团面经(3.21一面、3.26二面、4.1oc)2.4W
- 3... 愚人节限定:猜猜我说的话,真的or假的?1.7W
- 4... 26届暑期基本告一段落(😀)9188
- 5... 臣虽八股拉垮,但略懂点面试技巧!-- 论面试欧狗是怎么通过面试的😁6989
- 6... 双非初见白月光之腾讯云智一面6989
- 7... 跨考转码拿到美团offer | 尝试教大家背八股(一)6075
- 8... 命运的齿轮开始转动,我与牛客佬们的故事!5601
- 9... 美团 OC TimeLine4343
- 10... 老板为逼我离职,污蔑我偷窃还报警4156
正在热议
更多
# 笔试 #
2294600次浏览 26918人参与
# 机械/制造每日一题 #
53043次浏览 944人参与
# 腾讯云智研发2025实习生招聘 #
118007次浏览 1400人参与
# 牛友故事会 #
456880次浏览 10829人参与
# 毕业季,你想好怎么跟生活对线了吗? #
182270次浏览 3393人参与
# 京东工作体验 #
11210次浏览 82人参与
# 招行数字金融训练营 #
190639次浏览 556人参与
# 实习必须要去大厂吗? #
80850次浏览 1217人参与
# 机械人,说说你的烦心事 #
56218次浏览 778人参与
# 职场破防瞬间 #
57476次浏览 715人参与
# 实习学不到东西怎么办? #
185711次浏览 1988人参与
# 机械人值得去的国央企 #
56298次浏览 401人参与
# 机械人,你被简历秒挂的企业有哪些? #
32628次浏览 251人参与
# 我想象的实习vs现实的实习 #
266540次浏览 2148人参与
# 硬件人的春招flag #
37922次浏览 403人参与
# 入职第四天,心情怎么样 #
23354次浏览 348人参与
# 虾皮求职进展汇总 #
207013次浏览 1438人参与
# 你今年的平均薪资是多少? #
103387次浏览 521人参与
# 元戎启行求职进展汇总 #
27657次浏览 207人参与
# 2022毕业生求职现身说法 #
78220次浏览 670人参与
# 牛友们的论文几号送审 #
22702次浏览 581人参与
# 这些公司卡简历很严格 #
23233次浏览 93人参与