网站建设缺陷srcache缓存wordpress

web/2025/9/25 14:38:49/文章来源:
网站建设缺陷,srcache缓存wordpress,专做投放广告网站,哪里可以兼职答题转载自 ConcurrentHashMap能完全替代HashTable吗#xff1f;关于ConcurrentHashMap在之前的ConcurrentHashMap原理分析中已经解释了原理#xff0c;而HashTable其实大抵上只是对HashMap的线程安全的封装#xff0c;在JDK7与JDK8中HashMap的实现中解释了HashMap的原理。 至此…转载自  ConcurrentHashMap能完全替代HashTable吗关于ConcurrentHashMap在之前的ConcurrentHashMap原理分析中已经解释了原理而HashTable其实大抵上只是对HashMap的线程安全的封装在JDK7与JDK8中HashMap的实现中解释了HashMap的原理。 至此你应该能够明白ConcurrentHashMap与HashTable都可以用于多线程的环境但是当Hashtable的大小增加到一定的时候性能会急剧下降因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation)不论它变得多么大仅仅需要锁定map的某个部分而其它的线程不需要等到迭代完成才能访问map。简而言之在迭代的过程中ConcurrentHashMap仅仅锁定map的某个部分而Hashtable则会锁定整个map。 那么既然ConcurrentHashMap那么优秀为什么还要有Hashtable的存在呢ConcurrentHashMap能完全替代HashTable吗 HashTable虽然性能上不如ConcurrentHashMap但并不能完全被取代两者的迭代器的一致性不同的HashTable的迭代器是强一致性的而ConcurrentHashMap是弱一致的。 ConcurrentHashMap的getcleariterator 都是弱一致性的。 Doug Lea 也将这个判断留给用户自己决定是否使用ConcurrentHashMap。 那么什么是强一致性和弱一致性呢 get方法是弱一致的是什么含义可能你期望往ConcurrentHashMap底层数据结构中加入一个元素后立马能对get可见但ConcurrentHashMap并不能如你所愿。换句话说put操作将一个元素加入到底层数据结构后get可能在某段时间内还看不到这个元素若不考虑内存模型单从代码逻辑上来看却是应该可以看得到的。 下面将结合代码和java内存模型相关内容来分析下put/get方法。put方法我们只需关注Segment#putget方法只需关注Segment#get在继续之前先要说明一下Segment里有两个volatile变量count和tableHashEntry里有一个volatile变量value。 Segment#put V put(K key, int hash, V value, boolean onlyIfAbsent) {lock();try {int c count;if (c threshold) // ensure capacityrehash();HashEntry[] tab table;int index hash (tab.length - 1);HashEntry first tab[index];HashEntry e first;while (e ! null (e.hash ! hash || !key.equals(e.key)))e e.next;V oldValue;if (e ! null) {oldValue e.value;if (!onlyIfAbsent)e.value value;}else {oldValue null;modCount;tab[index] new HashEntry(key, hash, first, value);count c; // write-volatile}return oldValue;} finally {unlock();} } Segment#get V get(Object key, int hash) {if (count ! 0) { // read-volatileHashEntry e getFirst(hash);while (e ! null) {if (e.hash hash key.equals(e.key)) {V v e.value;if (v ! null)return v;return readValueUnderLock(e); // recheck}e e.next;}}return null; } 我们如何确定线程1放入某个变量的值是否对线程2可见当a hbhappen before c时a对c可见那么我们接下来我们只要寻找put和get之间所有可能的执行轨迹上的hb关系。要找出hb关系我们需要先找出与hb相关的Action。为方便这里将两段代码放到了一张图片上。可以注意到同一个Segment实例中的put操作是加了锁的而对应的get却没有。根据hb关系中的线程间Action类别可以从上图中找出这些Action主要是volatile读写和加解锁也就是图中画了横线的那些。 put操作可以分为两种情况一是key已经存在修改对应的value二是key不存在将一个新的Entry加入底层数据结构。 key已经存在的情况比较简单即if (e ! null)部分前面已经说过HashEntry的value是个volatile变量当线程1给value赋值后会立马对执行get的线程2可见而不用等到put方法结束。 key不存在的情况稍微复杂一些新加一个Entry的逻辑在else中。那么将new HashEntry赋值给tab[index]是否能立刻对执行get的线程可见呢我们只需分析写tab[index]与读取tab[index]之间是否有hb关系即可。 假设执行put的线程与执行get的线程的轨迹是这样的 执行put的线程执行get的线程⑧tab[index] new HashEntryK,V(key, hash, first, value) ②count c  ③if (count ! 0) ⑨HashEntry e getFirst(hash); tab变量是一个普通的变量虽然给它赋值的是volatile的table。另外虽然引用类型数组类型的变量table是volatile的但table中的元素不是volatile的因此⑧只是一个普通的写操作count变量是volatile的因此②是一个volatile写③很显然是一个volatile读⑨中getFirst方法中读取了table因此包含一个volatile读。 根据Synchronization Order对同一个volatile变量有volatile写 hb volatile读。在这个执行轨迹中时间上②在③之前发生且②是写count③是读count都是针对同一个volatile变量count因此有② hb ③又因为⑧和②是同一个线程中的③和⑨是同一个线程中的根据Program Order有⑧ hb ②③ hb ⑨。目前我们有了三组关系了⑧ hb ②② hb ③③ hb ⑨再根据hb关系是可传递的即若有x hb y且y hb z可得出x hb z可以得出⑧ hb ⑨。因此如果按照上述执行轨迹⑧中写入的数组元素对⑨中的读取操作是可见的。 再考虑这样一个执行轨迹 执行put的线程执行get的线程⑧tab[index] new HashEntryK,V(key, hash, first, value)  ③if (count ! 0)②count c  ⑨HashEntry e getFirst(hash); 这里只是变换了下执行顺序。每条语句的volatile读写含义同上但它们之间的hb关系却改变了。Program Order是我们一直拥有的即我们有⑧ hb ②③ hb ⑨。但这次对volatile的count的读时间上发生在对count的写之前我们无法得出② hb ⑨这层关系了。因此通过count变量在这个轨迹上是无法得出⑧ hb ⑨的。那么存不存在其它可替换关系让我们仍能得出⑧ hb ⑨呢 我们要找的是在⑧之后有一条语句或指令x在⑨之前有一条语句或指令y存在x hb y。这样我们可以有⑧ hb xx hb y y hb ⑨。就让我们来找一下是否存在这样的x和y。图中的⑤、⑥、⑦、①存在volatile读写但是它们在⑧之前因此对确立⑧ hb ⑨这个关系没有用处同理④在⑨之后我们要找的是⑨之前的因此也对这个问题无益。前面已经分析过了②③之间没法确立hb关系。 在⑧之后我们发现一个unlock操作如果能在⑨之前找到一个lock操作那么我们要找的x就是unlock要找的y就是lock因为Synchronization Order中有unlock hb lock的关系。但是很不幸运⑨之前没有lock操作。因此对于这样的轨迹是没有⑧ hb ⑨关系的也就是说如果某个Segment实例中的put将一个Entry加入到了table中在未执行count赋值操作之前有另一个线程执行了同一个Segment实例中的get来获取这个刚加入的Entry中的value那么是有可能取不到的 此外如果getFirst(hash)先执行tab[index] new HashEntryK,V(key, hash, first, value)后执行那么这个get操作也是看不到put的结果的。 …… 正是因为get操作几乎所有时候都是一个无锁操作get中有一个readValueUnderLock调用不过这句执行到的几率极小使得同一个Segment实例上的put和get可以同时进行这就是get操作是弱一致的根本原因。Java API中对此有一句简单的描述: Retrievals reflect the results of the most recently completed update operations holding upon their onset.也就是说API上保证get操作一定能看到已完成的put操作。已完成的put操作肯定在get读取count之前对count做了写入操作。因此也就是我们第一个轨迹分析的情况。 ConcurrentHashMap#clear clear方法很简单看下代码即知。 public void clear() {for (int i 0; i segments.length; i)segments[i].clear(); } 因为没有全局的锁在清除完一个segments之后正在清理下一个segments的时候已经清理segments可能又被加入了数据因此clear返回的时候ConcurrentHashMap中是可能存在数据的。因此clear方法是弱一致的。 ConcurrentHashMap中的迭代器 ConcurrentHashMap中的迭代器主要包括entrySet、keySet、values方法。它们大同小异这里选择entrySet解释。当我们调用entrySet返回值的iterator方法时返回的是EntryIterator在EntryIterator上调用next方法时最终实际调用到了HashIterator.advance()方法看下这个方法 final void advance() {if (nextEntry ! null (nextEntry nextEntry.next) ! null)return;while (nextTableIndex 0) {if ( (nextEntry currentTable[nextTableIndex--]) ! null)return;}while (nextSegmentIndex 0) {SegmentK,V seg segments[nextSegmentIndex--];if (seg.count ! 0) {currentTable seg.table;for (int j currentTable.length - 1; j 0; --j) {if ( (nextEntry currentTable[j]) ! null) {nextTableIndex j - 1;return;}}}} } 这个方法在遍历底层数组。在遍历过程中如果已经遍历的数组上的内容变化了迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组上的内容发生了变化则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的表现。 总结 ConcurrentHashMap的弱一致性主要是为了提升效率是一致性与效率之间的一种权衡。要成为强一致性就得到处使用锁甚至是全局锁这就与Hashtable和同步的HashMap一样了。Reference 1. http://blog.csdn.net/kobejayandy/article/details/16834311 2. http://ifeve.com/concurrenthashmap-vs-hashtable/ 3. http://ifeve.com/concurrenthashmap-weakly-consistent/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发网站公司有哪些长沙好的网站建设公司

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩…

做网站及小程序需要会哪些技能wordpress 反斜杠 luj

2001年16岁的我就去了浙江余姚打工,当时的我还没有现在大家那么大的野心,想干出一番大的事业,只能想着学一门技术能够有自己一席之地,当时我学过搓丝机,就是做螺丝,第一个月没有工资,老板给了我…

网站刚刚开始怎么做国外外包网站

产 城 96数字应用通信技术与计算机技术的融合发展聂东辉摘要:通信在人类社会发展和进步中发挥的作用毋庸置疑。通信方式的变革和通信技术的进步在很大程度上改变了人类社会的发展进程。目前通信技术和各个行业结合越来越亲密,因此我们在未来必须要通过对…

做网站哪里做网站有哪些需求

8. 代码设计 8.1 实用类设计 提前完成⼀些零碎的功能接⼝,以便于项⽬中会⽤到。 • 获取系统时间 • 判断⽂件是否存在 • 获取⽂件的所在⽬录路径 • 创建⽬录 /* 通⽤功能类,与业务⽆关的功能实现1. 获取系统时间2. 获取⽂件⼤⼩3. 创建⽬录4. 获取⽂…

做新闻类网站越南的网站建设

用CSS绘制三角形箭头。使用纯CSS,你只需要很少的代码就可以创作出各种浏览器都兼容的三角形箭头!CSS代码:/* create an arrow that points up */div.arrow-up {width: 0;height: 0;border-left: 5px solid transparent; /* left arrow slant */border-ri…

什么是企业网站源码wordpress怎么集中域名权重

一.核心作用 通过代理,控制对对象的访问;可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。 二.核心角色 抽象角色: 定义代理角色和真实角色的公共对外方法;真实角色: 实现抽…

营销型网站可以吗网站后台维护教程视频

标题党一下&#xff0c;本篇文章主要汇总了一些代码题&#xff0c;让大家写一些代码练习一下吧&#xff01; 变种水仙花_牛客题霸_牛客网 (nowcoder.com) #include<stdio.h> int main() {for (int i 10000; i < 99999; i) {int sum 0;for (int j 10; j < 1000…

网站建设与维护作业东莞市建设安监监督网站

编者: 昨天在微信群里得知 我们的朋友--装配脑袋(施凡老师),因白血病离我们而去,自从得病以来,施老师在积极的接受治疗&#xff0c;8.27 得到的消息还是比较让人开心的,大家都在期待着他能够重出江湖。装配脑袋一直在从事一个编译器项目,在博客园的博客里有个系列《自己动手开发…

网站建设作业教程网站建设怎么分析市场

好的。 也许我的标题太夸张了。 我确实相信Java&#xff0c;生态系统&#xff0c;社区&#xff0c;虚拟机和母编程语言将会存在很长一段时间。 有什么可以偏离的&#xff1f; 假设在我的酒店房间中花费大量时间&#xff0c;在我的演讲中增加技巧之间&#xff0c;我认为这将是一…

网站建设哪家好就推 鹏博资讯微信建网站

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——基本日志高级日志 的相关知识&#xff1b; 【1】记录日志 1.1&#xff09;出现的问题和解决方法&#xff1a; 1.1.1&#xff09;出现的问题&#xff1a;在我们调试…

什么是网站站点建设介绍wordpress前端会员

背景 有序列表换行后自动开启下一个标号&#xff0c;让人苦恼。 操作 操作系统换行操作 1. 【Enter】键是硬回车&#xff0c;即段落标记。回车后文字属于下一段落 2. 【shiftEnter】是软回车快捷键。即人工换行符。回车后文字仍属于前一段落&#xff0c;只不过重新换行。 …

做网站好还是做淘宝好网页设计实训总结200

thinkphp3.2自定义success及error跳转页面 默认的thinkphp success及error的默认模板不是很好看&#xff0c;下面分享如何自定义success及error页面&#xff0c;这里用的是thinkphp 3.2.2版本 默认的thinkphp success及error的默认模板不是很好看&#xff0c;下面分享大家如何自…

单页网站上传教程小型企业网络设计方案报告

NFS&#xff0c;Network File Syttem&#xff0c;网络文件系统。它允许网络上运行不同操作系统的主机通过网络连接到运行NFS服务的主机上&#xff0c;以实现数据共享。NFS的配置非常简单&#xff0c;经过简单的设置既能快速使用NFS。 使用NFS&#xff0c;首先在服务端运行NFS服…

福州网站建设联系时事在玩具网站开发背景

1-什么是跳表 跳表SkipList是一种随机化的数据结构&#xff0c;基于并联的链表&#xff0c;实现简单&#xff0c;插入、删除、查找的复杂度均为 O(logN)&#xff08;大多数情况下&#xff0c;因为是实现上是概率问题&#xff09;&#xff0c;因为其性能匹敌红黑树且实现较为简单…

企业网站开发报价形式游戏开发和网站开发那个有前景

网站首页优化TDK可以进入后台&#xff0c;系统设置--站点设置中&#xff0c;设置网站首页别名官方首页名称优化--长尾关键词【whatsns知识库开源内容付费php问答系统】&#xff0c;这样百度搜索问答系统&#xff0c;开源php问答系统&#xff0c;php问答系统&#xff0c;付费问答…

安全网站开发网络规划设计师教程最新版

PHP知识难点TOP3,挑战一下你这里有新鲜出炉的PHP设计模式&#xff0c;程序狗速度看过来&#xff01;PHP开源脚本语言PHP(外文名: Hypertext Preprocessor&#xff0c;中文名&#xff1a;“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点&#xf…

网站建设策划icp是什么

功能介绍 以51单片机作为主控系统&#xff1b;对空气空气中有毒有害气体进行监测&#xff1b;使用LCD1602液晶显示&#xff0c;采集到的PM2.5值通过单片机串口传输&#xff1b;通过传感器对室内PM2.5粉尘进行检查&#xff1b;通过按键设置的上限值&#xff1b;当检测到有毒气体…

简单的购物网站模板网站建设江阴

Apache ECharts 是一个基于 JavaScript 的开源可视化图表库&#xff0c;它提供了直观、交互丰富且可高度个性化定制的数据可视化图表。这个库最初由百度团队开源&#xff0c;并在 2018 年初捐赠给了 Apache 基金会&#xff0c;成为 ASF 的孵化级项目。在 2021 年 1 月 26 日&am…

查网站有没有做推广手机兼职赚钱平台

备考CFA一级满打满算用了一个多月&#xff0c;每天八个小时以上。可能如果仅以通过为目标的话完全不用这样&#xff0c;看过太多类似于只看了一周就通过了考试又或是放弃了好几门飘过了考试的情况&#xff0c;我觉得这是不正确的考试状态&#xff0c;完全不必惊叹&#xff0c;踏…