HashMap,Hashtabel,ConcurrentHashMap的区别
这三者的关系面试最常被问到的,在这里说下自己的理解。
首先HashMap是线程不安全的,在处理高并发的情况下不适用,Hatabel和Concurrent作为线程安全的集合类,就派上用场了。那这两者是怎么实现线程安全,以及两者的区别在哪呢?
首先我么来看一下Hashtabel的源码:
public synchronized V put(K key, V value) {// Make sure the value is not null
if (value == null) {throw new NullPointerException();
}// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
@SuppressWarnings("unchecked")
Entry<K,V> entry = (Entry<K,V>)tab[index];
for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}
}addEntry(hash, key, value, index);
return null;
}
public synchronized V get(Object key) {Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {if ((e.hash == hash) && e.key.equals(key)) {return (V)e.value;}
}
return null;
}
通过synchronize锁来实现线程安全的,这样就不会出现两个线程同时对数据进行操作,降低了执行的效率。
而ConcurrentHashMap则使用CAS算法,在读不加锁,写操作给每个segment加锁,其他的segment还可以被其他的线程操作,提高了并发的执行效率。java1.7之前实现方法:
分段锁
将内部进行分段,即segment,每个segment下HashEntry数组,和HashMap类似,加锁的时候在segment,不影响其他的segment,让锁的粒度变小
补充
ConcurrentHashMap主要是一个大的HashEntry数组和多个segment组成,通过两次hash算法,把数据存到segment的链表中。
segment继承RetrantLock,在进行put操作时,进行tryLock()获取锁,如果获取成功就插入到位置,如果获取失败,自旋循环获取,超过指定次数挂起,等待唤醒
jdk1.8是利用CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构
补充
Synchronize和RetrantLock的区别:
1 早期的时候,Synchronize是基于JVM的,调用操作的接口时间消耗较长
2 RetrantLock则是程序员手写的,通过lock()和unlock()方法配合try/finally语句块来完成。可以设置过期时间,避免死锁,而且设置了中断机制
3 java1.8后,synchronize有了很大的优化,性能和RetrantLock差不多
java中的锁有哪些??
可参考https://www.cnblogs.com/hustzzl/p/9343797.html
HashMap,Hashtabel,ConcurrentHashMap的区别相关推荐
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...
- HashMap与ConcurrentHashMap的区别
从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...
- (二)Java中的HashMap与ConcurrentHashMap的区别
HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了. ConcurrentHashMap具 ...
- 面试题:HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...
- Android-App-启动优化全记录,hashmap和concurrenthashmap的区别
控制线程数量 – 线程池 检查线程间的锁 ,防止依赖等待 使用合理的启动架构 微信内部使用的 mmkernel 阿里 Alpha 系统调度优化 应用启动的时候,如果主线程的工作过多,也会造成主线程过于 ...
- HashMap HashTable和ConcurrentHashMap的区别
HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronizatio ...
- Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的
多选 Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的:答案在文末 A. Hashtable的K ...
- 3、HashMap、HashTable和ConcurrentHashMap的区别?
HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTab ...
- HashMap、HashTable和ConcurrentHashMap的区别?
HashMap和HashTable的区别一种比较简单的回答是: (1)HashMap是非线程安全的,HashTable是线程安全的. (2)HashMap的键和值都允许有null存在,而HashTab ...
- HashMap、HashTable和ConcurrentHashMap的区别
HahMap.HashTable和ConcurrentHashMap的区别: HashMap HashTable ConcurrentHashMap null键 允许 不允许 不允许 null值 允许 ...
最新文章
- 通信基站电池,再也不怕丢了
- C++ reinterpret_cast,const_cast等 显式类型转换总结
- Python3中的 Filter的改变
- 高维(多变量)优化问题的技术与瓶颈
- 品牌怎么做知乎营销?
- Ubuntu换源-阿里源
- tp房产源码tpfangchan-fangcms-tphouse火车头采集软件方法
- FL Studio混合器之效果器插槽部分讲解
- Xcode10适配之libstdc++.6.0.9.tdb
- 数学规划模型(一):数学规划模型的基本知识
- 记一次TX2安装向日葵
- 野狐网游分析手记(2016年3月28日更新)
- lol8.18服务器不稳定,lol8月18日更新BUG修复一览 8月18日更新修复了哪些BUG
- 上海抗疫|上海:公安机关将持续抓好各项疫情防控措施落实,努力保民生、解民忧
- FPGA verilog 基于SPI总线协议控制flash的项目升级
- 诛仙3网游:物品无法快速销毁怎么办?
- typedef 定义函数指针
- Reversible Attack相关论文阅读
- CVPR2022-利用3D合成数据进行人像眼镜和阴影去除
- 用python 合并 excel多行成一行
热门文章
- Mybatis源码概览(一)
- 配置eclipse插件
- this kernel requires an x86-64 CPU, but only detected an i686 CPU
- 获取图层字段的唯一值集合(ArcEngine)
- Button.Text属性换行问题(Button.Bounds自动换行)
- 1.GitLab 安装使用
- 27. netstat
- 30. SELinux
- 2. crontab 的使用
- 72. 文件上传(1)