农历(十月初五)
关于
友情链接
Toggle navigation
Harries Blog™
追心中的海,逐世界的梦
首页
编程技术
Java
软件架构
移动开发
后端
前端
大数据
数据库
算法
人工智能
测试
代码管理
IT教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
Redis教程
Spring教程
Git教程
Java设计模式
Jenkins进阶系列
openfire参考指南
HBase教程
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Hive教程
ANTLR教程
Ant教程
java实例教程
SpringCloud
Elastic-Job-Lite
XStream教程
深入浅出MyBatis
Hazelcast教程
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
springcloud-demo
JPA教程
ActiveMQ中文指南
Java内存模型
java-demo
dubbo教程
Linux入门视频教程
生活感悟
默认分类
博主自留地
一周一本书
一月一个人
互联网
互联网.出海
互联网.IPO
运维
Linux
docker
nginx
windows
操作系统
监控软件
vmware
虚拟化
tomcat
自动化
留言板
转载
发表于 2019年09月21日
浏览 (
491
)
评论 (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
赏
分享
本文标签:
https
时间
src
HashMap
ip
大数据
同步
一致性
node
数据
锁
高并发
2019
tab
UI
缩小
垃圾回收
并发
java
map
list
ORM
synchronized
安全
value
删除
索引
线程
key
http
ConcurrentHashMap
空间
统计
HashTable
版权声明:
本文为互联网转载文章,出处已在文章中说明(部分除外)。如果侵权,请
联系本站长
删除,谢谢。
本文海报:
生成海报一
生成海报二
上一篇
Java日志框架:SLF4J详解
下一篇
Stream中map和flatMap差异分析
热门推荐
openfire数据库安装指南
浏览(13,614)
评论(0)
Caffe 深度学习框架上手教程
浏览(10,361)
评论(0)
ReactiveCocoa入门教程:第一部分
浏览(11,197)
评论(0)
开源HIDS-OSSEC使用实例:监测CC攻击
浏览(11,086)
评论(0)
Decorators in ES7
浏览(15,645)
评论(4)
用Electron(Atom编辑器的兄弟项目)开发桌面应用
浏览(28,668)
评论(0)
Windows下JetBrains CLion中文输出乱码的解决方法
浏览(12,115)
评论(1)
同步-@synchronized, NSLock, pthread, OSSpinLock性能比较
浏览(11,092)
评论(0)
Seaweedfs之Volume读请求重定向
浏览(25,363)
评论(3)
HTML、CSS及JavaScript : 有Promise,不会搞大肚子
浏览(13,228)
评论(0)
相关文章
WatchKit Storyboard攻略(三)
近段时间做的一些 clojure 轮子
iOS 9系列:Storyboard Reference、Strong IBOutlet以及Scene Dock
改变CSS世界纵横规则的writing-mode属性
java – 指南针Lucene点击
面试官:说说Java对象的组成
JVM的那些常用参数以及命令
【基础系列】实现一个简单的分布式定时任务(应用篇)
Intellij IDEA Debug 调试技巧
2020 必须掌握的 21 个 Java 核心技术
说给你听
本文目录
随机标签
最难赚钱
newProxyInstance
Service
营销方案
Routine Load
统一表达语言
key
新版人民币图样
jar
find
后援团
ajaxFileUpload
Bash Shell
Excel
E1子对象的E2。
乱码
EXHAUSTED
页回收机制
删除
show processlist
Atom
core
db
排序
聊天机器人
Windows 8
springioc
概率悖论
Android 5.0
message
ESB研究
参数处理
创繁致歉信!
布隆过滤器
apache
g4
多数据源
heartbeat
字迹
海上攻防
ISemaphore
生命
空间
统计
Jackrabbit
Qualifier
wget
ConcurrentHashMap
Service
SSL/TLS
并发工具包
书籍教程
springboot-demo
Java入门教程
bootstrap3
CSS
Apache基础教程
php
ionic 教程
Python
mysql教程
eclipse
Ubuntu VPS系统配置
AngularJS 教程
MongoDB教程
Struts2教程
Redis教程
Spring教程
Git教程
Java设计模式
Jenkins进阶系列
openfire参考指南
HBase教程
Maven教程
hibernate教程
Docker 教程
memcached教程
Quartz指南
Hive教程
ANTLR教程
Ant教程
java实例教程
SpringCloud
Elastic-Job-Lite
XStream教程
深入浅出MyBatis
Hazelcast教程
ibaties教程
SVN教程
rabittmq教程
Hadoop教程
solr教程
WebService CXF学习
springcloud-demo
JPA教程
ActiveMQ中文指南
Java内存模型
java-demo
dubbo教程
Linux入门视频教程
近期评论
admin
文章和留言都翻到11页了 没有OOM
admin
我试一下
匿名
朋友,翻页到11页,及以后,会出现OOM,无法访问
可以
搞个gitee的项目
匿名
666
admin
版本号是多少,你可以下载哪个代码仓库,jdk选1.8 直接跑就行
极客青年
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demo.et.mysql.MysqlTests': Unsatisfied dependency expressed through field 'userMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'demo.et.mysql.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:393) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:119) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'demo.et.mysql.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ... 30 more
极客青年
原封不动的代码报错如下:
极客青年
一股清流,敬佩
随机文章
站长推荐
近期文章
1
通过VS15将Win32应用程序移植到Windows 10
2
Android开发周报:Google I/O 2016成功举办、Android Studio 2.2来袭
3
每日一搏 | IBInspectable / IBDesignable 可视化控件编程讲解/使用/封装
4
OSChina 周三乱弹 —— 掌握写代码核心科技的名人们!
5
Git项目推荐 | Go 语言的一体化开发框架
6
Android调用系统相机和相册-坑篇
7
OSC 个人空间技能雷达 DEMO 上线——你的五芒星是什么样的?
8
用最少的机器支撑万亿级访问,微博6年Redis优化历程
9
让 Angular 应用动起来!
10
Django博客开发实战:开篇
1
VPS 自我监控
2
springboot接入多个ES启动时候自检报错
3
配置虚拟站点
4
openfire协议支持指南
5
修改上传文件权限
6
OpenVZ VPS 额外支持
7
2015年北京下第一场雪留念
8
openfire定制指南
9
mysql存储过程实例一:游标的使用
10
Linux删除或者新增SWAP分区
1
Spring Cloud Circuit Breaker快速入门Demo
2
Spring Cloud Bus快速入门Demo
3
Spring Cloud Config快速入门Demo
4
Spring Cloud Function快速入门Demo
5
SSPanel-Uim搭建教程 2023年全新定制版主题-解决老版本命令失效问题
6
Spring Boot集成Milvus和deeplearning4j实现图搜图功能
7
Spring Boot集成Aviator实现参数校验
8
ACME自动申请免费的通配符https域名证书
9
wordpress 数据库和文件优化
10
CentOS安装Docker与Docker-Compose
网站信息
文章总数:82,696 篇
文件总数:284,257 个
标签总数:2,380 个
分类总数:84 个
留言数量:2,560 条
在线人数:671 人
运行天数:4,392天
最后更新:2024年11月05日22点
×
输入密码查看文章详情
×
搜索文章
搜索
热门搜索:
Java
Springboot
Linux
Maven
Bootstrap
阿里云
×
评论信息框
可以通过QQ号实时获取昵称和头像
QQ
昵称
邮箱
网址
提交评论
×
山无棱江水为竭,冬雷震震夏雨雪,才敢请君舍
支付宝
微信
转账时请备注“
博客赞助
”
Loading...