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

福州有网站建设的公司北京seo工程师

福州有网站建设的公司,北京seo工程师,电商网站设计的企业,网站制作优化推广数据结构锁sizeCtlconcurrencyLevelForwardingNode、ReservationNode扩容get、put、removehashmap:线程不安全 hashtable:通过synchronized保证线程安全但效率低。强一致性 ConcurrentHashMap:弱一致性 数据结构 ConcurrentHashMap为node数…

      • 数据结构
      • sizeCtl
      • concurrencyLevel
      • ForwardingNode、ReservationNode
      • 扩容
      • get、put、remove

在这里插入图片描述

hashmap:线程不安全
hashtable:通过synchronized保证线程安全但效率低。强一致性
ConcurrentHashMap:弱一致性

数据结构

ConcurrentHashMap为node数组+链表+红黑树。约等于hashmap

//第一次使用时初始化,大小2^n
transient volatile Node<K,V>[] table;static class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;volatile V val;//不允许value改变值,避免加锁volatile Node<K,V> next;//不能改变next,只能头插
}

JDK1.8 中采用CAS + synchronized,锁首节点,粒度更小

// jdk1.7分段segment加锁,跨段操作时,按顺序锁定全部段,按顺序解锁。
//继承ReentrantLock加锁解锁,保证每个 Segment 是线程安全
static class Segment<K,V> extends ReentrantLock implements Serializable

sizeCtl

/**-N:有N-1个线程正在扩容-1:正在初始化(初始化只能由一个线程完成)0:未初始化N:下一次进行扩容的大小
*/
private transient volatile int sizeCtl;

concurrencyLevel

/**
* @param concurrencyLevel 估计的并发线程数
*/
public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLevel) {if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)throw new IllegalArgumentException();if (initialCapacity < concurrencyLevel)   // Use at least as many binsinitialCapacity = concurrencyLevel;   // as estimated threadslong size = (long)(1.0 + (long)initialCapacity / loadFactor);int cap = (size >= (long)MAXIMUM_CAPACITY) ?MAXIMUM_CAPACITY : tableSizeFor((int)size);this.sizeCtl = cap;
}

ForwardingNode、ReservationNode

static final int MOVED     = -1; // hash for forwarding nodes
static final int TREEBIN   = -2; // hash for roots of trees
static final int RESERVED  = -3; // hash for transient reservations/*** 扩容迁移时插到链表头部的节点* Hash地址为-1,存储nextTable的引用,作为一个占位符放在table中表示当前节点为null或者已被移动*/
static final class ForwardingNode<K,V> extends Node<K,V> {final Node<K,V>[] nextTable;ForwardingNode(Node<K,V>[] tab) {super(MOVED, null, null);this.nextTable = tab;}Node<K,V> find(int h, Object k) {}
}/*** computeIfAbsent and compute时的占位节点*/
static final class ReservationNode<K,V> extends Node<K,V> {ReservationNode() {super(RESERVED, null, null);}Node<K,V> find(int h, Object k) {}
}

扩容

将table分成n份 ,每份长度为stride,table大小除以CPU数量,平分给各个线程,每个线程对当前旧table中[transferIndex-stride, transferIndex-1]位置的结点进行迁移。某一位置链表/树全部迁移结束,使用ForwardingNode占据该位置。迁移时不需要rehash,同hashmap一样计算新下标即可

//扩容时使用 nextTable数组变成table的2倍。
private transient volatile Node<K,V>[] nextTable;
//扩容迁移时nextTable 切割的下标 (加一)
private transient volatile int transferIndex;
//扩容迁移时最小步长,避免太小耗费内存
private static final int MIN_TRANSFER_STRIDE = 16;
  • 当成功插入节点时,如果链表长度>= 8,则对数组长度进行判断,实现如下:如果数组长度<MIN_TREEIFY_CAPACITY(默认64),,则数组长度扩大两倍,重新调整节点的位置。不会将链表转为红黑树.
  • 当成功插入节点时达到阈值,触发扩容
  • 扩容状态下其他线程进行插入、修改、删除、合并、compute 等操作时遇到 ForwardingNode 节点会触发扩容 。helpTransfer

get、put、remove

  1. remove
    hash定位到node,复制节点前的链与节点后的链相连,跳过节点,即为删除
    ∵使用volatile修饰next,所以next值具有不变性,需要头插
    ∴节点前的链逆置

  2. get

  • 计算hash,定位,如果该节点存在,判断hash=-1则在新表中查询(帮助扩容),hash=-2按红黑树查询,否则在当前位置按链表查询
  • 不允许Key或Value为null,因为 ConcurrentHashMap 是用于多线程的 ,如果get(key)得到了 null ,不能确定是value为null,还是没有找到对应的key,存在二义性。 HashMap 可以通过containsKey() 去判断。
  • get无需加锁。因为 Node 的元素 value 和指针 next 是用 volatile。table用 volatile 修饰是保证扩容的时候保证可见性。
  1. put
  • 第一次插入 初始化table
  • 计算hash定位,CAS插入
  • 需要插入的位置上有数据&是forward节点(hash=-1),则表示其他线程正在对table进行扩容,参与一起扩容helpTransfer
  • 需要插入的位置上有数据&不是forward节点,对首节点加synchronized锁,插入(若此时需要扩容,扩容阻塞等待,先插入)
  • addCount()计算数量,扩容/链表调整为红黑树
http://www.yidumall.com/news/66250.html

相关文章:

  • 查备案怎么查询seo外链工具下载
  • vue快速搭建网站小说搜索风云榜排名
  • 网站建设规划公司地址友妙招链接
  • 建立网站的第一步网络营销的认识与理解
  • wordpress自定义简单注册西安seo服务公司排名
  • 如何建网站卖东西不限次数观看视频的app
  • 企业网站带数据库建站网站关键词优化
  • 企业网站建设找智恒网络无锡seo网站管理
  • 做网站服务器软件小学生摘抄新闻
  • 苏州模板网站建站宁波seo快速优化平台
  • 做服装团购有哪些网站有哪些百度电脑网页版入口
  • 宁德市城乡建设网站电商如何从零做起
  • 开发手机网站步骤怎么注册域名网址
  • 郑州有哪些做网站的公司亚马逊关键词搜索器
  • 建设银行网站打不开网站推广的意义和方法
  • 中国月球空间站免费crm客户管理系统
  • 怎么通过做网站赚钱吗互联网广告平台代理
  • 宝鸡网站建设价格站长工具seo推广秒收录
  • 公司内部自己做抽奖网站百度信息流投放在哪些平台
  • 辛集市建设局网站优化关键词的正确方法
  • 网站建设合作协议申请交换友情链接的渠道有哪些
  • 做企业网站报价搜狗网页搜索
  • 直销系统开发哈尔滨网站优化公司收费
  • 马可波罗网站做外贸企业网站有哪些功能
  • 成都网站海口网站建设竞价推广外包托管
  • 迅腾网络网站建设有限公司代理广告投放平台
  • 云南 房地产网站建设关键词优化的技巧
  • 有什么设计网站seo课程培训中心
  • 昆明网站建设公司哪家好微信朋友圈推广
  • 电子商务网站页面设计图片企业营销推广