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

企业网站建设 知乎seo顾问培训

企业网站建设 知乎,seo顾问培训,微信商户平台,网站备案注销怎么恢复SizeCtl的用法 sizeCtl0或容量大小 &#xff08;二个构造方法&#xff09; sizeCtl>0&#xff08;初始化或扩容后&#xff09;扩容阈值 sizeCtl-1&#xff1a;正在初始化中 sizeCtl<-1&#xff1a;线程扩容中 知道为什么第一个线程扩容时2&#xff0c;后面的其他线程扩容…

SizeCtl的用法

sizeCtl=0或容量大小 (二个构造方法)
sizeCtl>0(初始化或扩容后)扩容阈值
sizeCtl=-1:正在初始化中
sizeCtl<-1:线程扩容中
知道为什么第一个线程扩容时+2,后面的其他线程扩容+1(每加一次,代表新增一个线程扩容)
因为sizeCtl=-1代表初始化

binCount用法

链表,当前桶 高 binCount++
红黑树:2

rs

resizeStamp( ):盖扩容戳
见:https://blog.csdn.net/weixin_42169336/article/details/121133677
我理解的,先计算前面有多少个0,然后转成进行或运算(高16位0,低16位的第一位是1),
然后左移16位,这样就很明确了。
即高18位标记:迁移动作+容量标记,低16位,即线程数(每个线程如果要迁移,则加1)

后面有反操作,如果线程完成迁移的话,则会减1,所有线程减完,等到这个戳,表示迁移完了。

构造方法

public ConcurrentHashMap(int initialCapacity) {if (initialCapacity < 0)throw new IllegalArgumentException();int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ?MAXIMUM_CAPACITY :tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1));this.sizeCtl = cap;}

1.hash

(h ^ (h >>> 16)) & HASH_BITS;
将高位置0,因为后面要判断是MOVE等状态

2.初始化table

private final Node<K,V>[] initTable() {Node<K,V>[] tab; int sc;while ((tab = table) == null || tab.length == 0) {if ((sc = sizeCtl) < 0)Thread.yield(); // lost initialization race; just spinelse if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) {try {if ((tab = table) == null || tab.length == 0) {int n = (sc > 0) ? sc : DEFAULT_CAPACITY;@SuppressWarnings("unchecked")Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n];table = tab = nt;sc = n - (n >>> 2);}} finally {sizeCtl = sc;}break;}}return tab;}

2.尝试直接在桶下标放置元素

else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {if (casTabAt(tab, i, null,new Node<K,V>(hash, key, value, null)))break;                   // no lock when adding to empty bin}

3.判断是否在迁移

如果是,则线程协助迁移

 else if ((fh = f.hash) == MOVED)tab = helpTransfer(tab, f); 

4.加锁操作

(1) fh>0说明是链表操作
采用尾插法
(2) f instanceof TreeBin说是是红黑树

synchronized (f) {if (tabAt(tab, i) == f) {if (fh >= 0) {binCount = 1;for (Node<K,V> e = f;; ++binCount) {K ek;if (e.hash == hash &&((ek = e.key) == key ||(ek != null && key.equals(ek)))) {oldVal = e.val;if (!onlyIfAbsent)e.val = value;break;}Node<K,V> pred = e;if ((e = e.next) == null) {pred.next = new Node<K,V>(hash, key,value, null);break;}}}else if (f instanceof TreeBin) {Node<K,V> p;binCount = 2;if ((p = ((TreeBin<K,V>)f).putTreeVal(hash, key,value)) != null) {oldVal = p.val;if (!onlyIfAbsent)p.val = value;}}}}               

4.根据树高,判断是否需要树化

树高小于8且桶的长度小于64位,不能树化

if (binCount != 0) {if (binCount >= TREEIFY_THRESHOLD)treeifyBin(tab, i);if (oldVal != null)return oldVal;break;}

5.统计size

采用与logaddr分段的思想

6.扩容流程

(1) 判断能否扩容

 while (s >= (long)(sc = sizeCtl) && (tab = table) != null &&(n = tab.length) < MAXIMUM_CAPACITY)

(2)
(sc < 0:表示当前 table,【正在扩容】,sc 高 16 位是扩容标识戳,低 16 位是线程数 + 1

a.当前线程是触发扩容的第一个线程,线程数量 + 2

 // 逻辑到这说明当前线程是触发扩容的第一个线程,线程数量 + 2// 1000 0000 0001 1011 0000 0000 0000 0000 +2 => 1000 0000 0001 1011 0000 0000 0000 0010else if (U.compareAndSwapInt(this, SIZECTL, sc,(rs << RESIZE_STAMP_SHIFT) + 2))//【触发扩容条件的线程】,不持有 nextTable,初始线程会新建 nextTabletransfer(tab, null);

b.// 设置当前线程参与到扩容任务中,将 sc 低 16 位值加 1,表示多一个线程参与扩容

        // 设置失败其他线程或者 transfer 内部修改了 sizeCtl 值if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1))//【协助扩容线程】,持有nextTable参数transfer(tab, nt);

(3) stride步长,根据CPU或最小16长度
nextIndex与nextBound与i
------------------B---------I
----------------------------i-
// 推进标记
boolean advance = true;
// 完成标记
boolean finishing = false;

runBit
链表处理的 LastRun 机制,可以减少节点的创建
在这里插入图片描述

// 判断筛选出的链表是低位的还是高位的if (runBit == 0) {ln = lastRun;	// ln 指向该链表hn = null;		// hn 为 null}// 说明 lastRun 引用的链表为高位链表,就让 hn 指向高位链表头节点else {hn = lastRun;ln = null;}// 从头开始遍历所有的链表节点,迭代到 p == lastRun 节点跳出循环for (Node<K,V> p = f; p != lastRun; p = p.next) {int ph = p.hash; K pk = p.key; V pv = p.val;if ((ph & n) == 0)// 【头插法】,从右往左看,首先 ln 指向的是上一个节点,// 所以这次新建的节点的 next 指向上一个节点,然后更新 ln 的引用ln = new Node<K,V>(ph, pk, pv, ln);elsehn = new Node<K,V>(ph, pk, pv, hn);}// 高低位链设置到新表中的指定位置setTabAt(nextTab, i, ln);setTabAt(nextTab, i + n, hn);// 老表中的该桶位设置为 fwd 节点setTabAt(tab, i, fwd);advance = true;
http://www.tj-hxxt.cn/news/125039.html

相关文章:

  • 金融行业网站建设站长工具收录查询
  • 网站建设消费者群体分析公司网站制作
  • 政府的网站用什么系统做的东莞网站建设排名
  • 电子商务做网站设计关键词搜索引擎又称为
  • 公司营销型网站开发郴州网站建设网络推广渠道
  • 长春网站建设 信赖吉网传媒南宁seo规则
  • 有关风水的网站建设栏目南昌网站开发公司
  • 如何用.net做网站域名查询ip爱站网
  • 湖南建设银行网站是多少国外网站怎么推广
  • 有域名后怎么建网站免费海报模板网站
  • 商城网站备案能通过吗朋友圈产品推广文案
  • 海外高端网站建设建设网站的网站首页
  • 深圳制作网站培训学校百度搜索资源管理平台
  • c2c网站是什么网络营销方式方法
  • 网站制作优势网络营销与直播电商就业前景
  • 国内做网站建设好的中山seo推广优化
  • 做移门的网站怎么建网站教程
  • 做二手车放在哪个网站好网络推广中心
  • 中山网站建设公司建站
  • 建立简单网站万网域名管理入口
  • 章丘网站开发站长统计推荐
  • 网站后台排版合肥seo搜索优化
  • 做网站的第一步竞价托管外包费用
  • 外国网站快速申请qqseo学校
  • 包包17网站一起做网店网站制作详细流程
  • 网站建设好公司哪家好百度官网下载安装
  • 百度网站建设网站怎么才能被百度收录
  • 湖州北京网站建设宁波网站推广平台效果好
  • 国外的网站模板杭州百度推广
  • 国外做游戏的视频网站seo关键词排名优化专业公司