码迷,mamicode.com
首页 > 其他好文 > 详细

ConcurrentHashMap

时间:2018-02-22 21:33:15      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:map   哈希表   允许   可变   img   编程   shm   方法   数据结构   

ConcurrentHashMap中的key和value值都不能为null,HashMap中key可以为null,HashTable中key不能为null。
并发编程中ConcurrentHashMap是一个常用的数据结构,在线程安全的基础上提供了更好的写并发能力,是线程安全的类并不能保证使用了ConcurrentHashMap的操作都是线程安全的,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响
使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,
其他段的数据也能被其他线程访问,每个Segment段(继承ReentrantLock),能够实现真正的并发访问

ConcurrentHashMap中主要实体类就是三个:ConcurrentHashMap(整个Hash表),Segment(桶),HashEntry(节点)

技术分享图片
put方法的线程会获得锁,只有当此线程的put方法执行结束后才会释放锁,获得锁的线程会通知其他试图操作put方法的线程,并通知其他线程出于等待状态,直到释放锁后,其他线程才会去重新竞争锁。保证了ConcurrentHashMap的线程安全

get操作是不需要加锁的(如果value为null,会调用readValueUnderLock,只有这个步骤会加锁),通过易变volatile和final来确保数据安全。ConcurrentHashMap实现技术是保证HashEntry几乎是不可变的。HashEntry代表每个hash链中的一个节点,其结构如下所示:

static final class HashEntry<K,V> {

         final K key;  final int hash;   

         volatile V value;  volatile HashEntry<K,V> next;

}

总结:
ConcurrentHashMap使用了线程锁分段技术,每次访问只允许一个线程修改哈希表的映射关系,所以是线程安全的

 

 

我们可以使用CocurrentHashMap来代替Hashtable吗?”
这是另外一个很热门的面试题,因为ConcurrentHashMap越来越多人用了。我们知道Hashtable是synchronized的,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性

ConcurrentHashMap

标签:map   哈希表   允许   可变   img   编程   shm   方法   数据结构   

原文地址:https://www.cnblogs.com/webster1/p/8439372.html

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