并发容器的使用:识别不同场景下最优容器

本文探讨并发编程中如何根据场景选择合适的容器,分析不同并发容器的适用性,帮助开发者提升并发效率。

在并发编程中,我们经常会用到容器。今天我要和你分享的话题就是:在不同场景下我们该

如何选择最优容器。
并发场景下的 Map 容器
假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况
下,我们是用一个哈希表来存储商品和销量键值对,然后使用排序获得销量前十的商品。在
这里,哈希表是实现该功能的关键。那么请思考一下,如果要你设计这个功能,你会使用哪
个容器呢? 在 07 讲中,我曾详细讲过 HashMap 的实现原理,以及 HashMap 结构的各个优化细
节。我说过 HashMap 的性能优越,经常被用来存储键值对。那么这里我们可以使用
HashMap 吗?
答案是不可以,我们切忌在并发场景下使用 HashMap。因为在 JDK1.7 之前,在并发场景
下使用 HashMap 会出现死循环,从而导致 CPU 使用率居高不下,而扩容是导致死循环的
主要原因。虽然 Java 在 JDK1.8 中修复了 HashMap 扩容导致的死循环问题,但在高并发
场景下,依然会有数据丢失以及不准确的情况出现。
这时为了保证容器的线程安全,Java 实现了 Hashtable、ConcurrentHashMap 以及
ConcurrentSkipListMap 等 Map 容器。
Hashtable、ConcurrentHashMap 是基于 HashMap 实现的,对于小数据量的存取比较
有优势。
ConcurrentSkipListMap 是基于 TreeMap 的设计原理实现的,略有不同的是前者基于跳
表实现,后者基于红黑树实现,ConcurrentSkipListMap 的特点是存取平均时间复杂度是
O(log(n)),适用于大数据量存取的场景,最常见的是基于跳跃表实现的数据量比较大
的缓存。
回归到开始的案例再看一下,如果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值