SynchronizedHashMap和ConcurrentHashMap的区别
ConcurrrentHashMap
ConcurrentHashMap 使用锁分离技术来保证在多线程下的性能。它每次锁住一个桶,默认将 hash 表分为 16 个桶,诸如put和remove 等常用操作只锁当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有 16 个写线程执行,并发性能的提升是显而易见的。锁的粒度更小,并发程度更高。
读操作不加锁,非常快。由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。
ConcurrrentHashMap 使用一种不同的迭代方式。它不会抛出ConcurrentModificationException,即使一个线程在遍历的同时,另一个线程尝试进行修改。
Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap 允许多个修改操作并发进行,其关键在于使用了锁分离技术。有些方法需要跨桶,比如size()和containsValue(),它们可能需要锁定整个表而不仅仅是某个桶,这需要按顺序锁定所有桶,操作完毕后,又按顺序释放所有桶的锁。
段内扩容,段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容。插入前检测需不需要扩容,有效避免无效扩容。
SynchronizedHashMap
接下来主要说一下Collections类里的静态方法synchronizedMap(),入参有一个,需实现map接口。
同步整个对象,会极大降低性能。SynchronizedMap 每一次的读写操作都锁住整张表以保证线程安全,对读写加独占锁相当于同一时间内只允许至多一个线程操作整个Map,而其它线程必须等待,吞吐量和性能必然打折扣。
它有可能造成资源冲突(某些线程等待较长时间)。
SynchronizedHashMap会返回Iterator,当遍历时进行修改会抛出异常。
SynchronizedHashMap和ConcurrentHashMap的区别的更多相关文章
- 集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别
一.HashMap 的原理 1.HashMap简介 简单来讲,HashMap底层是由数组+链表的形式实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表 ...
- HashMap和Hashtable以及ConcurrentHashMap的区别
HashMap和Hashtable的区别 何为HashMap HashMap是在JDK1.2中引入的Map的实现类. HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部 ...
- HashMap HashTable和ConcurrentHashMap的区别
HashMap和Hashtable都实现了Map接口,其主要的区别有:线程安全性,同步(synchronization),以及效率. HashMap和Hashtable基本上没啥区别,除了HashMa ...
- Collections.synchronizedMap()与ConcurrentHashMap的区别
前面文章提到Collections.synchronizedMap()与ConcurrentHashM两者都提供了线程同步的功能.那两者的区别在哪呢?我们们先来看到代码例子. 下面代码实现一个线 ...
- HashMap、HashTable、ConcurrentHashMap的区别
一.相关概念 1.Map的概念 javadoc中对Map的解释如下: An objectthat maps keys to values . Amap cannot contain duplicate ...
- 一、基础篇--1.2Java集合-HashMap和ConcurrentHashMap的区别【转】
http://www.importnew.com/28263.html 今天发一篇”水文”,可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍.本来以为花不了多少时间的,不 ...
- HashMap、Hashtable和ConcurrentHashMap的区别
HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相 ...
- HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别
Map是Java最常用的集合类之一.它有很多实现类,我总结了几种常用的Map实现类,如下图所示.本篇文章重点总结几个Map实现类的特点和区别: 特点总结: 实现类 HashMap LinkedHash ...
- HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...
- java基础知识再学习--HashMap与ConcurrentHashMap的区别
引用:http://blog.csdn.net/xuefeng0707/article/details/40834595 从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是 ...
随机推荐
- Win系统重装备忘
蒙德,致态的盘坏块激增,似乎损坏到了系统文件:屏幕截屏会卡,关机后直接该块硬盘内的文件内容回滚,出现驱动报错要求重启... 然后尝试了DiskGenuis迁移系统,PE模式不能用,热迁移后似乎正常分区 ...
- Oralcle11.2.0.1.0使用出现的问题
问题1:oracle中监听程序当前无法识别连接描述符中请求服务 解决方法1: 查看oracle的服务是否开启,计算机->管理->服务和应用程序->服务,如下图 解决方法2: 找到or ...
- linux(centos)配置ipv6网卡
1.ipv6网卡配置文件和ipv4在同一个网卡配置文件中 vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好之后重启网卡生效 2.测试
- 《机器人SLAM导航核心技术与实战》先导课:SLAM的应用价值与技术难点
<机器人SLAM导航核心技术与实战>先导课:SLAM的应用价值与技术难点 视频讲解 [先导课]3.SLAM的应用价值与技术难点-视频讲解 [先导课]3.1.SLAM的应用价值与技术难点-S ...
- Win10资源管理器导航窗格显示/隐藏项目-注册表
一.隐藏快速访问 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer HubMode(类型:REG_DWORD) ...
- Docker安装及使用,Docker 安装MySQL、安装Tomcat、安装RabbitMQ
CentOS7安装Docker Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经 ...
- `QualitySettings.asyncUploadPersistentBuffer
在 Unity 中,`QualitySettings.asyncUploadPersistentBuffer` 是一个静态属性,它控制着纹理上传到 GPU 的异步方式.当启用时(设置为 `true`) ...
- 多线程,Join()
一.定义:就是该线程是指的主线程等待子线程的终止.也就是在子线程调用了join()方法,后面的代码,只有等到子线程结束了才能执行 二.不加join: class Thread1 extends Thr ...
- Java 中的强引用、软引用、弱引用和虚引用分别是什么?
Java 中的引用类型:强引用.软引用.弱引用和虚引用 Java 中的引用类型主要分为 强引用.软引用.弱引用 和 虚引用,它们对对象的生命周期和垃圾回收(GC)行为产生不同的影响. 1. 强引用(S ...
- kettle介绍-Step之Abort
Abort中止介绍 中止步骤用于读取指定行数之后停止读取剩余行数,可以用于调试转换 Step Name:步骤的名称,在单一的转换中,名称必须唯一 Abort threshold:指定行数,转换读取到指 ...