浅析currentHashmap的理解

浅析currentHashmap的理解1,currentHashMap的介绍currentHashMap是线程安全并且高效的一种容器,我们就需要研究一下currentHashMap为什么既能够保证线程安全,又可以保证高效的操作currentHashMap使用的原因为什么使用currentHashMap,这时候我们就需要和HashMap以及HashTable进行比较HashMap线程不安全的原因?在多线程的情况下,HashMa…

大家好,又见面了,我是你们的朋友全栈君。

1,currentHashMap的介绍

currentHashMap是线程安全并且高效的一种容器,我们就需要研究一下currentHashMap为什么既能够保证线程安全,又可以保证高效的操作
currentHashMap使用的原因
为什么使用currentHashMap,这时候我们就需要和HashMap以及HashTable进行比较
HashMap线程不安全的原因?
在多线程的情况下,HashMap的操作会引起死循环,导致CPU的占有量达到100%,所以在并发的情况下,我们不会使用HashMap.
至于为什么会引起死循环,大概是因为HashMap的Entry链表会形成链式的结构,一旦形成了Entry的链式结构,链表中的next指针就会一直不为空,这样就会导致死循环
不使用HashTable的原因?
其中使用synchronize来保证线程安全,即当有一个线程拥有锁的时候,其他的线程都会进入阻塞或者轮询状态,这样会使得效率越来越低
使用currentHashMap的锁分段技术可以有效的提高并发访问率
HashTable访问效率低下的原因,就是因为所有的线程在竞争同一把锁.如果容器中有多把锁,不同的锁锁定不同的位置,这样线程间就不会存在锁的竞争,这样就可以有效的提高并发访问效率,这就是currentHashMap所使用的锁分段技术
将数据一段一段的存储,然后为每一段都配一把锁,当一个线程只是占用其中的一个数据段时,其他段的数据也能被其他线程访问

2,currentHashMap的结构

currentHashMap是由Segment和HashEntry组成的.Segment是一种可重入的锁(Reentranlock),Segment在其中扮演锁的角色;HashEntry用于存储数据.一个CurrentHashMap包括一个Segment数组.一个Segment元素包括一个HashEntry数组,HashEntry是一种链表型的结构,每一个Segment维护着HashEntry数组中的元素,当要对HashEntry中的数据进行修改的时候,我们必须先要获得与它对应的Segment

这样的话,当修改该容器的不同的段时,就不会存在并发的问题,如图可知,我们得到一个元素需要进行两次hash操作,第一次得到Segment,第二次得到HashEntry中的链表头部,这样做会使得Hash的过程比普通的HashMap要长
写操作的时候可以只对元素所在的Segment进行加锁即可,不会影响到其他的Segment,这样,在最理想的情况下,ConcurrentHashMap可以最高同时支持Segment数量大小的写操作(刚好这些写操作都非常平均地分布在所有的Segment上)

2,JDK1.8的currentHashMap的原理

JDK1.8的currentHashMap参考了1.8HashMap的实现方式,采用了数组,链表,红黑树的实现方式,其中大量的使用CAS操作.CAS(compare and swap)的缩写,也就是我们说的比较交换.CAS是一种基于锁的操作,而且是乐观锁.java的锁中分为乐观锁和悲观锁.
悲观锁是指将资源锁住,等待当前占用锁的线程释放掉锁,另一个线程才能够获取线程.
乐观锁是通过某种方式不加锁,比如说添加version字段来获取数据
CAS操作包含三个操作数—–内存位置,预期的原值,和新值.如果内存的值和预期的原值是一致的,那么就转化为新值.CAS是通过不断的循环来获取新值的,如果线程中的值被另一个线程修改了,那么A线程就需要自旋,到下次循环才有可能执行。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150256.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 游戏中的“垂直同步”与“三重缓冲”究竟是个啥?[通俗易懂]

    游戏中的“垂直同步”与“三重缓冲”究竟是个啥?[通俗易懂]从今天开始,我们会开启“小教程”的兄弟栏目——小科普,给大家介绍在配电脑或玩游戏过程中经常会遇到的专业名词。第一期“小科普”我们来讲讲游戏中经常会遇到的一个画面选项——垂直同步我们曾在一期语音里和大家讲探讨过垂直同步的功用,可惜语音有60秒的长度限制,并不能和大家解释清楚,那么今天就来详细分析一下“垂直同步”:它到底是干嘛用的?它有什么缺点吗?

  • 什么是系统可用性[通俗易懂]

    什么是系统可用性[通俗易懂]在一个阳光明媚的周二下午,我正在公司里面看着即将发布的Java12的新特性,这时候女朋友打来电话。晚上下班后,女朋友回到家里面和我说,发现淘宝无法访问的十几分钟后又可以了。系统可用性系统

  • mysql 笛卡尔积

    mysql 笛卡尔积1、mysql笛卡尔积如图:我定义3张表(A、B、C)执行如下sql,查看执行顺序是a–>b–>c此时我改变A和C表的数据个数执行顺序变成了c–>b–>a相同的sql,由于表数量的改变造成表的执行顺序不一致的原因是:笛卡尔积2、子查询情况下,id值会不同结论:1、id值相同,从上往下顺序执行,数据少的表优先执行,大的表后执行2、id值不相同,id值越大越先执行大家有疑问可以添加qq群:789318548.

  • Java对象拷贝_对象的拷贝有几种方法

    Java对象拷贝_对象的拷贝有几种方法大多时候时候使用的是Apache或Spring“BeanUtils,今天,我们来看一下一个更高效的属性拷贝方式:BeanCopier。https://github.com/cglib/cglibhttps://github.com/cglib/cglib/blob/master/cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java首先梳理出来现在有哪些对象拷贝的方式:Apache的BeanUtils:BeanUtils是Apach.

  • 【SpringCloud】微服务笔记

    【SpringCloud】微服务笔记集中什么是微服务架构:1597213385700SpringCloud是微服务一站式服务解决方案,微服务全家桶。它是微服务开发的主流技术栈。它采用了名称,而非数字版本号。s方法gCloud和springCloudAlibaba目前是最主流的微服务框架组合。版本选择:选用springboot和springCloud版本有约束,不按照它的约束会有冲突。版本问题本次学习的各种软件的版本:boot使用的是数字作为版本。官网强烈建议升级到2.0以上cloud使用的是字母作为版本,伦

  • linux下连接mysql数据库命令,linux连接mysql命令[通俗易懂]

    linux下连接mysql数据库命令,linux连接mysql命令[通俗易懂]linux连接mysql是最基本的操作之一,对于初学者来说我们可以通过命令来连接mysql,下面由学习啦小编为大家整理了linux下连接mysql命令的相关知识,希望对大家有所帮助!linux连接MYSQL命令格式:mysql-h主机地址-u用户名-p用户密码linux连接mysql命令实例1、连接到本机上的MYSQL找到mysql的安装目录,一般可以直接键入命令mysql-uroot…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号