当前位置: 首页 > wzjs >正文

常州网站设计湛江公司电话统一身份认证平台

常州网站设计湛江公司电话,统一身份认证平台,asp网站建设技术方案,自己做电影网站有没有钱赚主要可以分为1.7和1.8两个版本 实现 ConcurrentHashMap 1.7 在 JDK 1.7 中它底层是数组链表的形式,一个ConcurrentHashMap里包含一个固定大小的Segment[]数组,默认大小是16,数组内又存了一些 HashEntry数组,而个 HashEntry 内部…

主要可以分为1.7和1.8两个版本 实现

ConcurrentHashMap 1.7

在 JDK 1.7 中它底层是数组+链表的形式,一个ConcurrentHashMap里包含一个固定大小的Segment[]数组,默认大小是16,数组内又存了一些 HashEntry数组,而个 HashEntry 内部是一个链表结构的元素,其实就相当于分配了一些segment,每个segment里面存了一个hashmap

Segment是一种分段锁,继承自ReentrantLock可重入锁,所以每个Segment自身具备加锁的功能,HashEntry则用于存储键值对数据。

大体的实现跟HashMap没有本质的区别,原理就是:

先通过key的hash值采用特定的算法来得到Segment数组的下标==>将这个 Segment 上锁==>然后通过key的hash&(数组大小-1)得到Segment里HashEntry数组的下标

这里的步骤就和HashMap一样了

  • 可以看到,图上我们有6个 Segment,那么等于有六把锁,因此共可以有六个线程同时操作这个ConcurrentHashMap,并发度就是6

  • 相比于直接将 put方法上锁,并发度就提高了,这就是分段锁

小结
  1. 1.7的分段锁已经有了细化锁粒度的概念

  2. 但它的一个缺陷Segment数组一旦初始化了之后不会扩容,只有 HashEntry 数组会扩容

  3. 这就导致并发度过于死板,不能随着数据的增加而提高并发度。

ConcurrentHashMap 1.8

1.8 有更细粒度的锁控制,底层就是Node 数组 + 链表 / 红黑树,我的理解是 1.8 就是舍弃了 Segment,然后把 HashMap 数组的每个结点都加了锁,这样扩容了锁也会变多,并发度也会增加

其次 1.8 也不借助ReentrantLock了,直接用synchronized

具体实现思路也简单 :

当塞入一个值的时候,先计算 key 的 hash值以及映射后的下标

  • 如果计算到的下标还未有结点,那么就通过CAS塞入新的 Node。

  • 如果已经有结点 则通过synchronized将这个 node 上锁,这样别的线程就无法访问这个 node 及其之后的所有节点。

  • 然后判断 key 是否相等,相等则替换 value ,反之则是新增一个 node,这个和 HashMap 是操作一样

已经用了synchronized,为什么还要用CAS呢

主要是一种权衡的考虑

  • 使用CAS:插入新元素,若计算出的哈希槽为空时,可以直接使用CAS操作来设置值。这种方式避免了加锁带来的开销,提高了并发性能。

  • 使用synchronized:若计算出的哈希槽不为空时,说明发生了哈希碰撞,使用synchronized能够保证只有一个线程可以修改共享资源。而如果继续用CAS可能会导致大量的重试操作,增加系统负担,

ConcurrentHashMap用了悲观锁还是乐观锁?

  • 悲观锁假设冲突是常态,因此在任何时候访问数据时都会先获取锁

  • 乐观锁则假设冲突是例外情况,因此不会在读取数据时加锁。

悲观锁和乐观锁都有用到。

添加元素时首先会判断容器是否为空:

  • 如果为空则 使用 volatileCAS (乐观锁) 来初始化。

  • 如果容器不为空,则根据存储的元素计算该位置是否为空。

    • 如果根据存储的元素计算结果为空,则利用 CAS(乐观锁) 设置该节点;

    • 如果根据存储的元素计算结果不为空,则使用 synchronized(悲观锁)

  • 然后,遍历桶中的数据,并替换或新增节点到桶中,最后再判断是否需要转为红黑树,这样就能保证并发访问时的线程安全了。

其次1.8 添加了协助扩容,也就是多线程扩容

  1. 触发扩容:当插入新元素导致超过数组元素大小*负载因子阈值时,会优先触发扩容操作。

  2. ConcurrentHashMap扩容过程中,会创建一个新数组,容量是原数组的两倍。但它不会一次性迁移整个旧表,而是将扩容任务分成多个小段,每次迁移一部分桶(bucket)。

  3. 多个线程可以同时参与扩容操作。每个线程负责一段桶的迁移,迁移完成后更新迁移进度,其他线程可以继续处理剩余未迁移的部分

  4. 具体就是ConcurrentHashMap通过使用一个transferIndex变量来记录当前迁移的进度。初始化为旧数组长度

  5. 每个线程在扩容时会尝试CAS抢占transferIndex 中的一段桶范围,执行数据迁移并更新transferlndex,其他线程同理 抢占transferIndex获取一部分桶范围


文章转载自:

http://nhOnHW9U.fprhg.cn
http://2s7lOdJa.fprhg.cn
http://SOwszgP7.fprhg.cn
http://twxZf7tS.fprhg.cn
http://npeorLYd.fprhg.cn
http://NWdb0zYG.fprhg.cn
http://YTFN3DUX.fprhg.cn
http://9JNkieSF.fprhg.cn
http://znUR6Tri.fprhg.cn
http://tsRgQlKM.fprhg.cn
http://GxvddMrp.fprhg.cn
http://fJC60kIV.fprhg.cn
http://ZQXC3McL.fprhg.cn
http://neAtAtRQ.fprhg.cn
http://FxrvBRr1.fprhg.cn
http://DkW8yq2f.fprhg.cn
http://fZ9TQ7ip.fprhg.cn
http://ni1tXwJ1.fprhg.cn
http://0MsqdKCx.fprhg.cn
http://bDqd7JfP.fprhg.cn
http://xQfRy8Ic.fprhg.cn
http://LatNiJGr.fprhg.cn
http://gnWCi30c.fprhg.cn
http://sC9LBZyn.fprhg.cn
http://3AqImfXR.fprhg.cn
http://9sdK39cH.fprhg.cn
http://9UAomV1M.fprhg.cn
http://vMWDcEt4.fprhg.cn
http://kTV0MXvn.fprhg.cn
http://Q48GIng4.fprhg.cn
http://www.dtcms.com/wzjs/645932.html

相关文章:

  • 手游传奇新开服网站天元建设集团有限公司年产值
  • 办个网站需要投资多少网线制作心得体会
  • 新手做网站选材如何运行wordpress
  • 问鼎电子娱乐下载官方网站坪山网站建设行业现状
  • 登录广东省建设监理协会网站首页小广告怎么举报
  • 什么是网站交互阿里巴巴国际站怎么找客户
  • 在线网站优化公司查询网站死链接
  • 郑州公司建站搭建教材资源网站建设
  • 单位网站建设费用什么会计科目搜索引擎的设计与实现
  • 互联网怎么做网站深圳建行网点
  • 国外公共空间设计网站做淘客app要网站吗
  • 福田做国外网站设计公司好吗武安网站建设
  • 网站备案幕布怎么做泰安网站建设公司
  • 网站标题空格一流的网站建设
  • 企业网站东莞网站建设制作网站收录不稳定
  • 做公司网站网站建设中iis
  • 做网站一般图片多大重庆百度关键词优化软件
  • 营销型网站搭建的工作装修建材网站
  • ps做网站画布多大重庆任务盟网站建设
  • 网站建设案例基本流程图cms网站源码
  • 长春网站建设4435北京做网站设计招聘
  • 成都市建设学校网站最大的网站建设
  • 做网站 多少人做网站应该用什么配置的手提电脑
  • 自建网站支付问题wordpress 主题 相册
  • 临沂做网站系统烟台市网站建设
  • 太原网站建设维护专业建设内容
  • 鞍山新款网站制作哪家好创业商机网加工项目
  • 用层还是表格做网站快万能浏览器网页版
  • 北京建设部网站为什么有人做商城优惠券网站卖
  • wordpress的短代码长沙做网站优化