本文共 709 字,大约阅读时间需要 2 分钟。
区别 | HashMap | Hashtable | ConcurrentHashMap |
安全性 | 非线程安全 | 线程安全 | 线程安全 |
性能 | 异步处理,性能高 | 同步处理,性能校低 | 适合高并发 |
null操作 | key和value允许存放null | 都不允许null | 都不允许null |
ConcurrentHashMap=HashMap的高性能+Hashtable的线程安全
多线程环境下,使用Hashmap进行put操作可能产生不同的结果,是非线程安全的,所以在多线程情况下不能使用HashMap。
HashTable,但是HashTable使用synchronized(他的get和put方法的实现代码如下)来保证线程安全,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占。在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,访问其他同步方法的线程就可能会进入阻塞或者轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低,不适合高并发。
ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了分段锁技术。它使用了多个锁来控制对hash表的不同部分进行的修改。put、remove操作会加锁,get读取操作不加锁。适合高并发场景。
HashMap JDK1.2 单线程情况下一般使用;
Hashtable JDK1.0 历史集合类,实现了map接口,已经逐渐被弃用;
ConcurrentHashMap JDK1.5 实际开发中多使用,多线程高并发场景;
转载地址:http://zebti.baihongyu.com/