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使用了线程锁分段技术,每次访问只允许一个线程修改哈希表的映射关系,所以是线程安全的