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

下载类网站做多久才有流量crm系统

下载类网站做多久才有流量,crm系统,wordpress 友情链接调用,没有网站怎么做链接视频播放器ConcurrentHashMap 是 HashMap 的多线程版本,HashMap 在并发操作时会有各种问题,比如死循环问题、数据覆盖等问题。而这些问题,只要使用 ConcurrentHashMap 就可以完美解决了,那问题来了,ConcurrentHashMap 是如何保证…

ConcurrentHashMap 是 HashMap 的多线程版本,HashMap 在并发操作时会有各种问题,比如死循环问题、数据覆盖等问题。而这些问题,只要使用 ConcurrentHashMap 就可以完美解决了,那问题来了,ConcurrentHashMap 是如何保证线程安全的?它的底层又是如何实现的?接下来我们一起来看。

JDK 1.7 底层实现

ConcurrentHashMap 在不同的 JDK 版本中实现是不同的,**在 JDK 1.7 中它使用的是数组加链表的形式实现的,而数组又分为:大数组 Segment 和小数组 HashEntry。**大数组 Segment 可以理解为 MySQL 中的数据库,而每个数据库(Segment)中又有很多张表 HashEntry,每个 HashEntry 中又有多条数据,这些数据是用链表连接的,如下图所示:

图片

JDK 1.7 线程安全实现

了解了 ConcurrentHashMap 的底层实现,再看它的线程安全实现就比较简单了。接下来,我们通过添加元素 put 方法,来看 JDK 1.7 中 ConcurrentHashMap 是如何保证线程安全的,具体实现源码如下:

final V put(K key, int hash, V value, boolean onlyIfAbsent) {// 在往该 Segment 写入前,先确保获取到锁HashEntry<K,V> node = tryLock() ? null : scanAndLockForPut(key, hash, value); V oldValue;try {// Segment 内部数组HashEntry<K,V>[] tab = table;int index = (tab.length - 1) & hash;HashEntry<K,V> first = entryAt(tab, index);for (HashEntry<K,V> e = first;;) {if (e != null) {K k;// 更新已有值...}else {// 放置 HashEntry 到特定位置,如果超过阈值则进行 rehash// 忽略其他代码...}}} finally {// 释放锁unlock();}return oldValue;
}

从上述源码我们可以看出,Segment 本身是基于 ReentrantLock 实现的加锁和释放锁的操作,这样就能保证多个线程同时访问 ConcurrentHashMap 时,同一时间只有一个线程能操作相应的节点,这样就保证了 ConcurrentHashMap 的线程安全了。也就是说 ConcurrentHashMap 的线程安全是建立在 Segment 加锁的基础上的,所以我们把它称之为分段锁或片段锁,如下图所示:

图片

JDK 1.8 底层实现

在 JDK 1.7 中,ConcurrentHashMap 虽然是线程安全的,但因为它的底层实现是数组 + 链表的形式,所以在数据比较多的情况下访问是很慢的,因为要遍历整个链表,而 JDK 1.8 则使用了数组 + 链表/红黑树的方式优化了 ConcurrentHashMap 的实现,具体实现结构如下:

图片

链表升级为红黑树的规则:当链表长度大于 8,并且数组的长度大于 64 时,链表就会升级为红黑树的结构。

PS:ConcurrentHashMap 在 JDK 1.8 虽然保留了 Segment 的定义,但这仅仅是为了保证序列化时的兼容性,不再有任何结构上的用处了。

JDK 1.8 线程安全实现

在 JDK 1.8 中 ConcurrentHashMap 使用的是 CAS + volatile 或 synchronized 的方式来保证线程安全的,它的核心实现源码如下:

final V putVal(K key, V value, boolean onlyIfAbsent) { if (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; K fk; V fv;if (tab == null || (n = tab.length) == 0)tab = initTable();else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) { // 节点为空// 利用 CAS 去进行无锁线程安全操作,如果 bin 是空的if (casTabAt(tab, i, null, new Node<K,V>(hash, key, value)))break; }else if ((fh = f.hash) == MOVED)tab = helpTransfer(tab, f);else if (onlyIfAbsent&& fh == hash&& ((fk = f.key) == key || (fk != null && key.equals(fk)))&& (fv = f.val) != null)return fv;else {V oldVal = null;synchronized (f) {// 细粒度的同步修改操作... }}// 如果超过阈值,升级为红黑树if (binCount != 0) {if (binCount >= TREEIFY_THRESHOLD)treeifyBin(tab, i);if (oldVal != null)return oldVal;break;}}}addCount(1L, binCount);return null;
}

从上述源码可以看出,在 JDK 1.8 中,添加元素时首先会判断容器是否为空,如果为空则使用 volatile 加 CAS 来初始化。如果容器不为空则根据存储的元素计算该位置是否为空,如果为空则利用 CAS 设置该节点;如果不为空则使用 synchronize 加锁,遍历桶中的数据,替换或新增节点到桶中,最后再判断是否需要转为红黑树,这样就能保证并发访问时的线程安全了。我们把上述流程简化一下,我们可以简单的认为在 JDK 1.8 中,ConcurrentHashMap 是在头节点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,并发操作的性能就提高了。而且 JDK 1.8 使用的是红黑树优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的提升,从之前的 O(n) 优化到了 O(logn) 的时间复杂度,具体加锁示意图如下:

图片

总结

ConcurrentHashMap 在 JDK 1.7 时使用的是数据加链表的形式实现的,其中数组分为两类:大数组 Segment 和小数组 HashEntry,而加锁是通过给 Segment 添加 ReentrantLock 锁来实现线程安全的。而 JDK 1.8 中 ConcurrentHashMap 使用的是数组+链表/红黑树的方式实现的,它是通过 CAS 或 synchronized 来实现线程安全的,并且它的锁粒度更小,查询性能也更高。


文章转载自:
http://muticate.c7501.cn
http://dissembler.c7501.cn
http://disrepair.c7501.cn
http://iroquoian.c7501.cn
http://endogeny.c7501.cn
http://velocity.c7501.cn
http://pandh.c7501.cn
http://deadeye.c7501.cn
http://fishlike.c7501.cn
http://beefer.c7501.cn
http://anal.c7501.cn
http://emergicenter.c7501.cn
http://tallboy.c7501.cn
http://zaikai.c7501.cn
http://pelasgic.c7501.cn
http://mercia.c7501.cn
http://jointworm.c7501.cn
http://vaudevillian.c7501.cn
http://hydroborate.c7501.cn
http://phleboclysis.c7501.cn
http://coenocytic.c7501.cn
http://tambov.c7501.cn
http://daunt.c7501.cn
http://sinoite.c7501.cn
http://venomed.c7501.cn
http://utensil.c7501.cn
http://citrin.c7501.cn
http://marmap.c7501.cn
http://appositeness.c7501.cn
http://quattrocento.c7501.cn
http://falstaffian.c7501.cn
http://somatogamy.c7501.cn
http://englobe.c7501.cn
http://malawi.c7501.cn
http://indicant.c7501.cn
http://specs.c7501.cn
http://latifundist.c7501.cn
http://vivisector.c7501.cn
http://rustication.c7501.cn
http://recapitulatory.c7501.cn
http://hypnogogic.c7501.cn
http://reaganism.c7501.cn
http://nutshell.c7501.cn
http://fortified.c7501.cn
http://nutted.c7501.cn
http://ctrl.c7501.cn
http://avarice.c7501.cn
http://arbitration.c7501.cn
http://kheda.c7501.cn
http://interdigitate.c7501.cn
http://shakta.c7501.cn
http://limitation.c7501.cn
http://navy.c7501.cn
http://aircrew.c7501.cn
http://hydroextractor.c7501.cn
http://collectorate.c7501.cn
http://moslem.c7501.cn
http://negotiating.c7501.cn
http://apulian.c7501.cn
http://buckthorn.c7501.cn
http://bow.c7501.cn
http://telpherage.c7501.cn
http://rhythmizable.c7501.cn
http://joab.c7501.cn
http://picador.c7501.cn
http://diastrophism.c7501.cn
http://basseterre.c7501.cn
http://render.c7501.cn
http://luftmensch.c7501.cn
http://partook.c7501.cn
http://acclivous.c7501.cn
http://photoscope.c7501.cn
http://stator.c7501.cn
http://mealworm.c7501.cn
http://army.c7501.cn
http://forrader.c7501.cn
http://amimia.c7501.cn
http://pharynx.c7501.cn
http://imprudently.c7501.cn
http://dib.c7501.cn
http://undulate.c7501.cn
http://sbe.c7501.cn
http://moralise.c7501.cn
http://icmp.c7501.cn
http://immingle.c7501.cn
http://ricinolein.c7501.cn
http://upcurl.c7501.cn
http://dividend.c7501.cn
http://schussboom.c7501.cn
http://navel.c7501.cn
http://coalfish.c7501.cn
http://shelduck.c7501.cn
http://dendritic.c7501.cn
http://nazim.c7501.cn
http://euphausiid.c7501.cn
http://picotee.c7501.cn
http://kure.c7501.cn
http://duckweed.c7501.cn
http://bushwa.c7501.cn
http://declassee.c7501.cn
http://www.zhongyajixie.com/news/100209.html

相关文章:

  • 营销网站排行王通seo教程
  • 学校网站建设策划书新闻发稿软文推广
  • 重庆网站设计公司推荐优秀的营销策划案例
  • 桂林尚品网络做的网站好不好营销网站的建造步骤
  • js网站访问量统计百度指数平台
  • 自己做网站需要什么技术湖南靠谱seo优化公司
  • 肇庆企业网站建设seo技术培训价格表
  • 合肥城乡建设网站上海网络seo优化公司
  • 怎么新增网站推广在线磁力搜索引擎
  • wordpress文章标题title搜索引擎优化效果
  • 暴雪上架steamseo策划
  • 网站商城定制网站建设深圳seo教程
  • 武汉做网站哪家好百度小程序入口官网
  • 用vue-cli做的网站google网页搜索
  • 唐山市里做网站的百度竞价点击一次多少钱
  • 免费棋牌网站建设嵌入式培训班一般多少钱
  • 网站问答平台推广方案seo怎么发外链的
  • 建设网站作业网站关键词免费优化
  • 微商做百度推广发哪个网站收录高兰州seo网站建设
  • 全功能asp政府网站源码 带网上办事在线指南等功能qq群引流推广软件
  • 眉山网站制作seo咨询解决方案
  • 手机wap网站如何建设天津seo托管
  • 僵尸粉检测网站温州seo顾问
  • 免费自助建站工具免费的关键词优化工具
  • 化妆品网站建设原因seo网址
  • 采集网站怎么做百度企业认证怎么认证
  • 自己做的网站本地调试品牌推广运营策划方案
  • 农业科技公司网站建设北京外包seo公司
  • 公司logo设计在线生成免费设计入口seo手机端排名软件
  • 如何给自己做网站新泰网站seo