在了解 HashMap 的的原理时,对于 jdk7 和 8 的实现是不同的,同样,对于支持并发的 ConcurrentHashMap 来说其实现也不相同。
其主要区别在于两者保证线程安全的机制不同,jdk7 采用的是分段锁的概念,每一个分段都有一把锁,锁内存储的着数据,锁的个数在初始化之后不能扩容。
而 jdk8 的 ConcurrentHashMap 数据结构同 HashMap,通过 Synchronized+CAS 来保证其线程安全。
jdk7
在 jdk7 中,有一个非常重要的概念就是 Segment,实际上我们发现,同 HashMap 的设计一样,它也是用来存储数据的一个变量。
/**
* The segments, each of which is a specialized hash table.
* 表示 每一段都是一个hash表
*/
final Segment<K,V>[] segments;
在 Segment 这个内部类中,有一个 table 变量,在 HashMap 中存储数据也是叫 table 的变量。

这里叫 HashEntry,而 HashMap 中就叫 Entry,其内部成员变量都大致相同,HashEntry 如下:
static final class HashEntry<K,V> {
final int hash;
final K key;
volatile V value;
volatile HashEntry<K,V> next;
HashEntry(int hash, K key, V value, HashEntry<K,V> next) {
this.hash = hash;
this.key = key;
this

最低0.47元/天 解锁文章
1123

被折叠的 条评论
为什么被折叠?



