Hashmap/Hashtable/ConcurentHashmap/synchronizedMap

本文深入解析了Java集合框架中的线程安全特性,对比了Hashtable、HashMap、Collections.synchronizedMap和ConcurrentHashMap的区别,重点讨论了线程安全与性能之间的权衡。通过分析不同集合类在多线程环境下的表现,揭示了如何在确保数据一致性的同时,提高程序的并发性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hashtable提供了一种易于使用的、线程安全的、关联的map功能。 然而,线程安全性是凭代价换来的——Hashtable的所有方法都是同步的。synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费。

HashMap提供一个不同步的基类和一个同步的包装器Collections.synchronizedMap(对应List和Collections.synchronizedList,更安全使用CopyOnWriteArrayList),解决了线程安全性问题。 通过将基本的功能从线程安全性中分离开来,Collections.synchronizedMap是有条件地线程安全——所有单个的操作都是线程安全的,但是多个操作组成的操作序列却可能导致数据争用,因为在操作序列中控制流取决于前面操作的结果。允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。

ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。

24223012_utWQ.jpg

左边便是Hashtable的实现方式---锁整个hash表;而右边则是ConcurrentHashMap的实现方式---锁桶(或段)。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。原来只能一个线程进入,现在却能同时16个写线程进入,并发性的提升是显而易见的。并且ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作。


参考:

http://blog.sina.com.cn/s/blog_5157093c0100hm3y.html

http://www.blogjava.net/zlsunnan/archive/2006/07/02/56184.html

转载于:https://my.oschina.net/OQKuDOtsbYT2/blog/212075

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值