码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础知识强化之集合框架笔记78:ConcurrentHashMap之 ConcurrentHashMap、Hashtable、HashMap、TreeMap区别

时间:2016-07-24 19:08:59      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

1. Hashtable:

(1)是一个包含单向链的二维数组,table数组中是Entry<K,V>存储,entry对象;

(2)放入的value不能为空;

(3)线程安全的,所有方法均用synchronized修饰;


2. HashMap:

(1)相当于Hashtable的升级版本;

(2)可以放入空值;

(3)基于hash表实现;

(4)按插入的顺序存储;

(5)线程不安全:因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap

3. ConcurrentHashMap:

通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,慧眼独具的Doug Lee立马拿出了解决方案----ConcurrentHashMap,也是线程安全的。

我觉得可以理解为ConcurrentHashMap的一个segment相当于是一个Hashtable;
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图:

技术分享


4. TreeMap:

(1)基于红黑树实现;

(2)是有序的存储;

(3)自己可以定义排序器;

 

5. Hashtable 和 ConcurrentHashMap 的区别 ?

相同点:

(1)Hashtable 和 ConcurrentHashMap都是线程安全的,可以在多线程环境中运行;

(2)key跟value都不能是null。

 

不同点:

主要是两者性能上差别

(1)效率低下的Hashtable

Hashtable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下Hashtable的效率非常低下。因为当一个线程访问Hashtable的同步方法时,其他线程访问Hashtable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。

(2)采用锁分段技术的ConcurrentHashMap

HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

Java基础知识强化之集合框架笔记78:ConcurrentHashMap之 ConcurrentHashMap、Hashtable、HashMap、TreeMap区别

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/5701246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!