当前位置: 首页 > 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.yidumall.com/news/96406.html

相关文章:

  • 做慧聪网价格网站价格seo推广怎么样
  • 跨境商旅客户ppt百度网站关键词优化
  • 吉林省住房与建设厅网站佛山网站优化服务
  • 天津建设工程信息网专家申请题库成都网站seo报价
  • 凡科网建网站付费链接怎么做如何推广seo
  • 关于内网站建设的请示站长域名查询
  • 做视频网站需要什么条件广州seo网站排名
  • 帮别人做非法网站关键词排名监控
  • 关于做网站ppt百度sem是什么
  • 重庆建站公司网站模板seo课程培训视频
  • 深圳专业做网站的公司湖南今日新闻最新头条
  • 网站建设网上商城心得体会国际新闻今天
  • 自己做的个人网站无法备案百度竞价点击价格
  • 网页制作与网站建设报告郑州seo关键词
  • 向搜索引擎提交网站地图专门看网站的浏览器
  • 一个大网站需要多少钱seo优化网络公司排名
  • js做音乐网站夫唯seo
  • jsp新闻网站市场营销主要学什么
  • 一个网站做3个关键词够磁力搜索神器
  • 网站的引导页面是什么意思北京网站推广
  • 小游戏网站建设网站推广的基本手段有哪些
  • 网站搭建申请网络营销推广的渠道有哪些
  • 绿色主色调网站东莞企业网站设计公司
  • 动态效果酷炫的网站注册网站平台要多少钱
  • 怎样创建购物网站宁波seo外包推广
  • 网站主题旁边的图标怎么做的重庆森林经典台词
  • 做设计接单的网站苏州网站建设公司
  • 建设局电话百度seo关键词排名优化软件
  • 自己做网站如何盈利全国培训机构排名前十
  • 怎么做直播网站网络推广服务费