ConcurrentHashMap在Java8中的变化
增加红黑树这个存储结构
在Java8中,为什么要增加红黑树这种数据结构来进行存储,而不是全部使用链表来进行存储呢? 1.因为攻击者可以构造大量具有相同hashCode的内容,使其全部放在同一个列表中,这样,在查找的时候,所花费的时间会很长。这个时候,如果采用红黑树这个结构来进行存储,那么其查找的效率会高很多。 2.hashCode()函数的计算有时候并不合理,例如重写hashCode函数的时候。如果都映射到同一个位置,那么查找的时间也会很长。
mappingCount()
在ConcurrentHashMap中如果存储大量的元素,那么使用size()方法获取的结果可能不正确,因为其是用int类型作为返回值的。
如果想要获取到正确的结果,那么可以使用hashMap.mappingCount();其返回值为long类型。
更新指定键中的值
ConcurrentHashMap是一个安全的数据结构(get()、put()操作不会破坏数据结构),但是它的并不保证操作值的安全。例如设置对应键的值,这个就不是线程安全的。
如何才能安全地更新值呢?
使用replace()方法
值使用的是LongAdder,它可以保证原子操作
Java8新增的方法来实现线程安全地对键进行操作
ConcurrentHashMap在Java8中的变化的更多相关文章
- Java7与Java8中的HashMap和ConcurrentHashMap知识点总结
JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这 ...
- Java8 中 ConcurrentHashMap工作原理的要点分析
简介: 本文主要介绍Java8中的并发容器ConcurrentHashMap的工作原理,和其它文章不同的是,本文重点分析了不同线程的各类并发操作如get,put,remove之间是如何同步的,以及这些 ...
- Java7 和 Java8 中的 ConcurrentHashMap 原理解析
Java7 中 ConcurrentHashMap ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些. 整个 ConcurrentHash ...
- java7,java8 中HashMap和ConcurrentHashMap简介
一:Java7 中的HashMap 结构: HashMap 里面是一个数组,然后数组中每个元素是一个单向链表.链表中每个元素称为一个Entry 实例,Entry 包含四个属性:key, value, ...
- java8 中的时间和数据的变化
java8除了lambda表达式之外还对时间和数组这两块常用API做想应调整, Stream 有几个常用函数: store 排序 (a,b)-> a.compareTo(b) 排出来的结果是正 ...
- java8中ConcurrentHashMap
HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上. Fast-fail: fail-fast 机制是java集合(Collection)中的一种错误机制. ...
- Java8中的HashMap分析
本篇文章是网上多篇文章的精华的总结,结合自己看源代码的一些感悟,其中线程安全性和性能测试部分并未做实践测试,直接是“拿来”网上的博客的. 哈希表概述 哈希表本质上一个数组,数组中每一个元素称为一个箱子 ...
- java8中map的meger方法的使用
java8中map有一个merge方法使用示例: /** * 打印出包含号码集的label的集合 * * @param args */ public static void main(String[] ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- Java8函数之旅 (二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
随机推荐
- 注意注意!!!!关于keil的问题,调试时候的bug
1.keil变量不区分大小写: 2.KEIL调试debug时误报,未定义某变量 但是实际定义了的. 今天用keil写代码 感觉逻辑上没问题 但是始终不是那个效果 检查了半天错误问题.最后debug居然 ...
- gitlab 已有代码仓库推送到另外一个gitlab仓库
创建一个新仓库 git clone ssh://git@gitlab.***************.git cd plt-calcium-report-web touch README.md git ...
- C# 委托/回调
public delegate void MyDelegate();//定义一个委托类型 MyDelegate myDelegate;//创建一个委托变量 myDelegate = new MyDel ...
- 如何添加Eclipse项目到SVN资源库
Eclipse项目添加到SVN版资源库有如下好处:一是轻松备份,每天做的修改内容一键提交:二方便合作,比较大的项目,多个人一起工作的时候,每人及时将完成的代码提交,别人可以下载浏览:三展示项目完成进度 ...
- python函数传参是传值还是指针
python中,往函数传参传的是指针,并非传值. 代码说话 如果改变函数参数的值,我们来看看改变: 但是如果是传的列表这种可变数据类型呢 传列表并没有发送改变,仍然指向的是原来的地址. 这是因为传的数 ...
- vue.cli的安装配置
关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli(1.x 或 2.x),你需要先通过 npm uninstall vue ...
- gRPC 入门(一)
前言 在学习 gRPC 之前,先学习 protobufu 协议,简单的来理解,我们可以使用他来定义 消息 和 服务.然后你只需要实现服务即可,剩下的东西,gRPC 会帮你自动完成. protobufu ...
- 解决Delphi报Range check error错误
没有深入研究,大体是Debug下编译的运行就报错,Release下编译的正常. 后来发现Debug模式下会打开越界检查. Project--> Option -->Delphi Compl ...
- 初次使用gitee的笔记
步骤及问题 1.git config --global user.name "username" 2.git config --global user.email "us ...
- 读后笔记 -- Java核心技术(第11版 卷 II) Chapter3 XML
3.1 XML Introduction An XML document is made up of elements. An element can have attributes (key/val ...