首页 文章 精选 留言 我的

精选列表

搜索[容器配置],共10000篇文章
优秀的个人博客,低调大师

并发容器(四) —— ConcurrentHashMap 和 Hashtable 的区别

HashMap 不是线程安全的,而 ConcurrentHashMap 和 Hashtable 它们两个都是线程安全的,那它们有哪些不同点呢? 出现版本不同 Hashtable 在 JDK1.0 的时候就存在了,并在 JDK1.2 版本中实现了 Map 接口,成为了集合框架的一员。 而 ConcurrentHashMap 则是在 JDK1.5 中才出现的,也正是因为它们出现的年代不同,而后出现的往往是对前面出现的类的优化,所以它们在实现方式以及性能上,也存在着较大的不同。 实现线程安全的方式不同 从原理上分析,Hashtable 实现并发安全的原理是通过 synchronized 关键字,从源码角度,以 clear() 方法为例,代码如下: publicsynchronizedvoidclear(){ Entry<?,?>tab[]=table; modCount++; for(intindex=tab.length;--index>=0;) tab[index]=null; count=0; } clear() 方法是被 synchronized 关键字所修饰的,同理其他的方法例如 put、get、size 等,也同样是被 synchronized 关键字修饰的。之所以 Hashtable 是线程安全的,是因为几乎每个方法都被 synchronized 关键字所修饰了,这也就保证了线程安全。 Collections.SynchronizedMap(new HashMap()) 的原理和 Hashtable 类似,也是利用 synchronized 实现的。 而 ConcurrentHashMap 实现的原理,却有大大的不同 本质上它实现线程安全的原理是利用了 CAS + synchronized + Node 节点的方式,这和 Hashtable 的完全利用 synchronized 的方式有很大的不同。 性能不同 因为它们在线程安全的实现方式上的不同,导致它们在性能方面也有很大的不同。当线程数量增加的时候: Hashtable 的性能会急剧下降,因为每一次修改都需要锁住整个对象,而其他线程在此期间是不能操作的。不仅如此,还会带来额外的上下文切换等开销,所以此时它的吞吐量甚至还不如单线程的情况。 而在 ConcurrentHashMap 中,就算上锁也仅仅会对一部分上锁而不是全部都上锁,所以多线程中的吞吐量通常都会大于单线程的情况,也就是说,在并发效率上,ConcurrentHashMap 比 Hashtable 提高了很多。 迭代时修改的不同 Hashtable(包括 HashMap)不允许在迭代期间修改内容,否则会抛出ConcurrentModificationException 异常,其原理是检测 modCount 变量,迭代器的 next() 方法的代码如下: publicTnext(){ if(modCount!=expectedModCount) thrownewConcurrentModificationException(); returnnextElement(); } next() 方法中,会首先判断 modCount 是否等于 expectedModCount。其中 expectedModCount 是在迭代器生成的时候随之生成的,并且不会改变。 它所代表的含义是当前 Hashtable 被修改的次数,而每一次去调用 Hashtable 的包括 addEntry()、remove()、rehash() 等方法中,都会修改 modCount 的值。这样一来,如果我们在迭代的过程中,去对整个 Hashtable 的内容做了修改的话,也就同样会反映到 modCount 中。这样一来,迭代器在进行 next 的时候,也可以感知到,于是它就会发现 modCount 不等于 expectedModCount,就会抛出 ConcurrentModificationException 异常。 所以对于 Hashtable 而言,它是不允许在迭代期间对内容进行修改的。 相反,ConcurrentHashMap 即便在迭代期间修改内容,也不会抛出ConcurrentModificationException。 如果我们有并发的场景,那么使用 ConcurrentHashMap 是最合适的,Hashtable 已经不再推荐使用。

优秀的个人博客,低调大师

边缘容器服务:边缘原生应用与实践

云原生和边缘计算是近两年非常火的技术领域了,本文由阿里云高级技术专家熊鹰分享,希望通过介绍现在阿里云在边缘计算和边缘原生这些技术领域的经验,让大家能了解到现在边缘计算的发展现状、边缘适合的业务场景、以及5G和MEC时代我们对于边缘原生的一些思考。 边缘定义 身处不同的领域和角度,运营商、云服务厂商、硬件厂商,大家对于边缘计算的定义是不一样的。阿里云早在2018年12月联合中国电子技术标准化研究院输出边缘计算-边缘云技术及标准化白皮书,在2019年也联合各方推动在做边缘云通用技术要求及标准测试,都是希望一方面推动边缘计算理念达到行业共识,另外,也是想希望在关键技术和架构上来推动主流标准的建立,在业务上去定义一个标准的服务面。 边缘云标准中,定义边缘计算为在靠近终端(人和物)的网络节点,提供分布式、可定义、可调度、标准开放且安全的计算平台及

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册