农历(六月十五)
关于
友情链接
Toggle navigation
Harries Blog™
追心中的海,逐世界的梦
首页
编程技术
Java
软件架构
移动开发
后端
前端
大数据
数据库
算法
人工智能
测试
100 Days of AI Programming
代码管理
IT教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
springcloud-demo
Redis教程
Spring教程
Git教程
openfire参考指南
Jenkins进阶系列
Java设计模式
HBase教程
java-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Ant教程
java实例教程
Hive教程
SpringCloud
ANTLR教程
XStream教程
Elastic-Job-Lite
Hazelcast教程
深入浅出MyBatis
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
生活感悟
默认分类
博主自留地
一周一本书
一月一个人
互联网
互联网.出海
互联网.IPO
运维
Linux
docker
nginx
windows
操作系统
监控软件
vmware
虚拟化
tomcat
自动化
留言板
转载
发表于 2019年09月21日
浏览 (
756
)
评论 (0)
Java性能 -- 并发容器
某电商系统需要统计销量TOP 10的商品,通常用
哈希表
来存储商品和销量的键值对,然后使用
排序
获取销量TOP 10的商品
并发场景下不能使用HashMap
JDK
1.7
,在并发场景下使用HashMap会出现
死循环
,导致
CPU使用率居高不下
,而
扩容
是导致死循环的主要原因
JDK
1.8
,虽然修复了HashMap扩容导致的死循环问题,但在高并发场景下,依然会有
数据丢失
和
不准确
的情况
为了保证Map容器的
线程安全
,Java实现了
HashTable
、
ConcurrentHashMap
、
ConcurrentSkipListMap
HashTable、ConcurrentHashMap是
基于HashMap
实现的,适用于
小数据量
存取的场景
ConcurrentSkipListMap是
基于TreeMap
的设计原理实现的
ConcurrentSkipListMap是基于
跳表
实现的,而TreeMap是基于
红黑树
实现的
ConcurrentSkipListMap最大的特点是存取
平均时间复杂度
为
O(log(n))
,适用于
大数据量
存取的场景
HashTable / ConcurrentHashMap
在数据
不断地写入和删除
,且
不存在
数据
累积
以及数据
排序
的场景下,可以选用HashTable或者ConcurrentHashMap
HashTable使用
synchronized同步锁
修饰了put、get、remove等方法
在
高并发
场景下,读写操作都会存在大量
锁竞争
,给系统带来
性能开销
相比于HashTable,ConcurrentHashMap在保证
线程安全
的基础上兼具了
更好的并发性能
JDK 1.7中,ConcurrentHashMap使用了
分段锁Segment
减少了锁粒度,优化了锁的并发操作
JDK 1.8中,ConcurrentHashMap做了大量的改动,
摒弃了Segment的概念
synchronized同步锁在JDK 1.6的性能已经得到了很大的提升
在JDK 1.8中,
重启了synchronized同步锁
,通过synchronized实现
Node
作为锁粒度
put方法:没有哈希冲突时,使用
CAS
进行添加元素操作;有哈希冲突时,
通过synchronized将链表锁定
在统计销量TOP 10的场景下,首选ConcurrentHashMap
ConcurrentHashMap的
整体性能
要优于HashTable,但某些场景下ConcurrentHashMap不能替代HashTable
例如
强一致性
的场景,ConcurrentHashMap的get、size等方法都
没有加锁
,ConcurrentHashMap是
弱一致性
的
ConcurrentHashMap / ConcurrentSkipListMap
ConcurrentHashMap在
数据量比较大
的时候,
链表会转换为红黑树
红黑树在并发情况下,删除和插入过程有个
平衡
的过程,会涉及到
大量结点
,
竞争锁资源的代价相对较高
而
跳跃表
的操作针对
局部
,需要
锁住的结点少
,在并发场景下性能会更好一些
在
非线程安全
的Map中,基于
红黑树
实现的
TreeMap
在
单线程
中的
性能表现
并不比跳跃表差
因此
在
非线程安全
的Map容器中,使用
TreeMap
来存取
大数据
在
线程安全
的Map容器中,使用
ConcurrentSkipListMap
来存取
大数据
跳跃表
跳跃表是基于链表扩展实现的一种特殊链表,类似于
树
的实现
跳跃表不仅实现了
横向链表
,还实现了
垂直方向
的
分层索引
一个跳跃表由若干层链表组成,每一层都实现了一个
有序链表索引
,只有
最底层包含所有数据
每一层由下往上依次通过一个指针
指向上层相同值的元素
,每层数据依次减少,到最顶层只会保留部分数据
跳跃表利用了
空间换时间
的方法来提高查询效率,程序总是从
最顶层
开始查询访问,通过判断元素值来缩小查询范围
初始化的跳跃表
查询Key值为9的结点
新增Key值为8的结点,首先
新增
一个结点(
CAS操作
)到
最底层
的链表中
根据概率算出level值,再根据level值新建索引层,最后
链接
索引层的新结点(
CAS操作
)
删除Key值为7的结点,首先找到待删除结点,将其
value
值设置为
null
之后再向
待删除结点的next位置
新增一个
标记结点
,以便减少
并发冲突
然后让待删除结点的前驱结点直接越过本身指向的待删除结点,直接指向后继结点,中间要被删除的结点最终会被垃圾回收
最后判断此次删除后是否导致某一索引层没有其他节点了,并视情况删除该层索引
使用场景
HashTable:数据
强一致性
ConcurrentHashMap:(大部分情况)数据
弱一致性
ConcurrentSkipListMap:数据量在
千万
级别,且存在
大量的增删改
操作
原文
http://zhongmingmao.me/2019/08/30/java-performance-concurrent-container/
正文到此结束
赞
0
赏
分享
本文标签:
ip
大数据
同步
一致性
node
数据
锁
高并发
2019
tab
UI
缩小
垃圾回收
并发
java
map
list
ORM
synchronized
安全
value
删除
索引
线程
key
http
ConcurrentHashMap
空间
统计
HashTable
https
时间
src
HashMap
版权声明:
本文为互联网转载文章,出处已在文章中说明(部分除外)。如果侵权,请
联系本站长
删除,谢谢。
本文海报:
生成海报一
生成海报二
上一篇
Java日志框架:SLF4J详解
下一篇
Stream中map和flatMap差异分析
热门推荐
openfire数据库安装指南
浏览(15,529)
评论(0)
Caffe 深度学习框架上手教程
浏览(11,664)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(12,476)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(12,360)
评论(0)
Decorators in ES7
浏览(17,019)
评论(4)
用Electron(Atom编辑器的兄弟项目)开发桌面应用
浏览(29,966)
评论(0)
Windows下JetBrains CLion中文输出乱码的解决方法
浏览(13,412)
评论(1)
2015年北京下第一场雪留念
浏览(8,096)
评论(17)
同步-@synchronized, NSLock, pthread, OSSpinLock性能比较
浏览(12,305)
评论(0)
【开班了】JAVA培训班正式招生
浏览(8,514)
评论(12)
相关文章
pinpoint 使用和相关源码解析
Spring中的某些内容,如’init-method’,但在依赖注入之后调用?
Hibernate Search 6.0.0.Alpha3 发布,数据检索框架
java多线程 线程安全问题
HelloGitHub 第 38 期
java 反射借助 asm 获取参数名称最优雅简单的方式
分享一套全网最新 Spring Cloud Alibaba 视频教程
APK 协议分析
Java并发编程那些事儿(一) ——任务与线程
Java虚拟机#1——Java内存模型
说给你听
本文目录
随机标签
autocommit
beta测试
中国电信
EasyExcel
JSQLParser
IBM
Annotation
核心原则
Timekeeping
老同志
监听器
分布式组件
jquery-confirm
ssh
JobDataMap
Keycloak
Jet engine
打印sql
占用空间
0308010C
Spring Cloud Function
隐藏层
FileZip
OAuth 2.0
npm
漏水严重
CEO
Jet engine
fstab
Ilya Grigorik
Windows 8
ETEDM
属性混叠
混叠
XML
scroll
文件上传
加密
O2O
memecache
wget
GraalVM
心声
streaming
StatementHandler
bigdata 3.0
镜像同步
定价策略
VPS 内存监控
xmpp.openfire
客户管理
书籍教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
springcloud-demo
Redis教程
Spring教程
Git教程
openfire参考指南
Jenkins进阶系列
Java设计模式
HBase教程
java-demo
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Ant教程
java实例教程
Hive教程
SpringCloud
ANTLR教程
XStream教程
Elastic-Job-Lite
Hazelcast教程
深入浅出MyBatis
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
JPA教程
ActiveMQ中文指南
Java内存模型
dubbo教程
python3-demo
Linux入门视频教程
近期评论
Harrries
暂时不支持rss
Sul
请问站点支持RSS吗,url是什么?解析不到,看了下首页源码里好像也没有。
admin
已加上
admin
大佬,你网站有一段时间打不开,我还以为你不做了呢
灰常记忆
??? 我的链接居然被你干掉了?
oliver
666 666
666
666
admin
文章和留言都翻到11页了 没有OOM
admin
我试一下
匿名
朋友,翻页到11页,及以后,会出现OOM,无法访问
随机文章
站长推荐
近期文章
1
使用Mocha和Chai来测试Node.js应用
2
做博士还是做一个专业的程序员?
3
【一月一个人】王羲之
4
携程移动App架构优化之旅
5
【电子书下载】PowerDesigner操作手册V0.1.1.ppt
6
利用redis协助mysql数据库搬迁
7
架构师实践日|MongoDB的Docker化实践
8
Windows Secondary Logon服务中的一个句柄权限泄露Bug
9
通过node开发一款命令行工具的教材
10
机器学习与数据挖掘中的十大经典算法
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
只需要75美元就可以拥有一个终身免费的邮箱服务(250G+15个域名)
2
Day1:Project Kick-off Meeting Content(100 Days of AI Programming)
3
Using AI to build a recruitment website plan(100 Days of AI Programming)
4
Augment Agent:自动生成代码的未来
5
使用 acme.sh 自动更新 SSL 证书的指南
6
使用Cloudflare加速网站的具体操作步骤
7
如何开通google Free Tier长期免费云服务器(1C/1G)
8
如何获取oracle cloud永久免费的vps(4C/24G)?
9
dify开启多租户模式
10
Dify 服务器部署指南
网站信息
文章总数:82,770 篇
文件总数:284,416 个
标签总数:2,445 个
分类总数:86 个
留言数量:2,568 条
在线人数:663 人
运行天数:4,638天
最后更新:2025年07月09日15点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注“
博客赞助
”
Loading...