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

dz网站如何搬家深圳全网推广公司

dz网站如何搬家,深圳全网推广公司,朝鲜活埋新冠病人视频,如何评价小米的网站建设专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 理解ConcurrentHashMap为什么线程安全;ConcurrentHashMap的具体细节还需要进一步研究 目录 ConcurrentHashMap介绍JDK7的分段锁实现JDK8的synchr…

专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162

本文目标:

  1. 理解ConcurrentHashMap为什么线程安全;ConcurrentHashMap的具体细节还需要进一步研究

目录

    • ConcurrentHashMap介绍
    • JDK7的分段锁实现
    • JDK8的synchronized + CAS实现
      • put方法

ConcurrentHashMap介绍

百度AI介绍如下:
在这里插入图片描述

JDK7的分段锁实现

在 JDK7 中,ConcurrentHashMap 使用“分段锁”机制实现线程安全,数据结构可以看成是”Segment数组+HashEntry数组+链表”,一个 ConcurrentHashMap 实例中包含若干个 Segment 实例组成的数组,每个 Segment 实例又包含由若干个桶,每个桶中都是由若干个 HashEntry 对象链接起来的链表。

Segment 类继承 ReentrantLock 类,锁的粒度为其中一个Segment,而不是整体。

在这里插入图片描述

JDK8的synchronized + CAS实现

在这里插入图片描述

每个桶可能是链表结构或者红黑树结构,锁针对桶的头节点加,锁粒度小

put方法

定位Node数组位置使用CAS操作定位,真正进行插入操作的时候会使用synchronized关键字加锁头部

/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {// key, value 都不能为nullif (key == null || value == null) throw new NullPointerException();int hash = spread(key.hashCode());int binCount = 0;for (Node<K,V>[] tab = table;;) {Node<K,V> f; int n, i, fh;// 如果Node数组是空,则进行初始化;初始化是CAS操作if (tab == null || (n = tab.length) == 0)tab = initTable();else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {// 数组位置节点为null,则CAS方式进行添加Node到数组位置if (casTabAt(tab, i, null,new Node<K,V>(hash, key, value, null)))break;                   // no lock when adding to empty bin}else if ((fh = f.hash) == MOVED)// 如果数组位置节点正在迁移,则帮助迁移tab = helpTransfer(tab, f);else {// 没有迁移,且数组位置不是空,则进行聊表或者红黑树的插入操作,可能涉及到链表转红黑树V oldVal = null;// 直接用 synchronized 锁住 链表或者红黑树的头部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;}}}}if (binCount != 0) {if (binCount >= TREEIFY_THRESHOLD)treeifyBin(tab, i);if (oldVal != null)return oldVal;break;}}}addCount(1L, binCount);return null;
}

put完成后addCount(1L, binCount);会进行数量统计和扩容判断操作,也是CAS操作

/*** Adds to count, and if table is too small and not already* resizing, initiates transfer. If already resizing, helps* perform transfer if work is available.  Rechecks occupancy* after a transfer to see if another resize is already needed* because resizings are lagging additions.** @param x the count to add* @param check if <0, don't check resize, if <= 1 only check if uncontended*/
private final void addCount(long x, int check) {CounterCell[] as; long b, s;if ((as = counterCells) != null ||!U.compareAndSwapLong(this, BASECOUNT, b = baseCount, s = b + x)) {CounterCell a; long v; int m;boolean uncontended = true;if (as == null || (m = as.length - 1) < 0 ||(a = as[ThreadLocalRandom.getProbe() & m]) == null ||!(uncontended =U.compareAndSwapLong(a, CELLVALUE, v = a.value, v + x))) {fullAddCount(x, uncontended);return;}if (check <= 1)return;s = sumCount();}if (check >= 0) {Node<K,V>[] tab, nt; int n, sc;while (s >= (long)(sc = sizeCtl) && (tab = table) != null &&(n = tab.length) < MAXIMUM_CAPACITY) {int rs = resizeStamp(n);if (sc < 0) {if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 ||sc == rs + MAX_RESIZERS || (nt = nextTable) == null ||transferIndex <= 0)break;if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1))transfer(tab, nt);}else if (U.compareAndSwapInt(this, SIZECTL, sc,(rs << RESIZE_STAMP_SHIFT) + 2))transfer(tab, null);s = sumCount();}}
}
http://www.khdw.cn/news/52353.html

相关文章:

  • 网站建设按什么收费整站优化和单词
  • 会展设计制作优化方案的格式及范文
  • 圣辉友联做网站公司长岭网站优化公司
  • 网站制作服务订单济南seo优化公司
  • 做网站建设的公司有哪些sem是什么电镜
  • 俄语网站都哪些抖音关键词搜索排名收费
  • 网站优化毕业设计外贸营销网站
  • 做网站推广怎么做网页制作成品
  • java下的wordpress大连seo建站
  • 南充做网站厦门seo怎么做
  • 在线做venn图网站种子搜索神器网页版
  • 网站关键词优化服务海外品牌推广
  • 网站的关键词在哪里设置青岛网络推广公司排名
  • 寻找郑州网站建设公司海外推广专员
  • 西安房产网签查询系统南宁网站seo外包
  • 柳州电商网站建设免费留电话的广告
  • 做剧情游戏的网站网络营销该如何发展
  • 局域网视频网站建设点播系统seo优化在线
  • 大连华南网站制作公司安徽关键词seo
  • 虚拟网站怎么做兰州网络推广公司哪家好
  • 郑州市住房和城乡建设委员会网站seo网上课程
  • 3.15网站建设鹤壁网络推广哪家好
  • 便利店网站建设拓扑图韶关seo
  • 网店运营推广方式如何提高搜索引擎优化
  • 2008系统做网站小程序推广的十种方式
  • 产品开发流程的六个阶段是苏州seo网站推广哪家好
  • 天津企业做网站多少钱windows优化大师是系统软件吗
  • 服务网站排名咨询流量推广怎么做
  • 武汉 开发 公司 网站建设最新seo网站优化教程
  • 高端网站案例欣赏江门seo网站推广