File tree Expand file tree Collapse file tree 1 file changed +1
-1
lines changed Expand file tree Collapse file tree 1 file changed +1
-1
lines changed Original file line number Diff line number Diff line change @@ -445,7 +445,7 @@ Test.parallelStream avgt 5 186345456.667 ± 3210435.590 ns/op
445445
446446`ConcurrentHashMap ` 和 `Hashtable ` 的区别主要体现在实现线程安全的方式上不同。
447447
448- - ** 底层数据结构:** JDK1 . 7 的 `ConcurrentHashMap ` 底层采用 ** 分段的数组+ 链表** 实现,JDK1 . 8 采用的数据结构跟 ` HashMap1 . 8 ` 的结构一样,数组+ 链表/ 红黑二叉树。`Hashtable ` 和 JDK1 . 8 之前的 `HashMap ` 的底层数据结构类似都是采用 ** 数组+ 链表** 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;
448+ - ** 底层数据结构:** JDK1 . 7 的 `ConcurrentHashMap ` 底层采用 ** 分段的数组+ 链表** 实现,在 JDK1 . 8 中采用的数据结构跟 ` HashMap ` 的结构一样,数组+ 链表/ 红黑二叉树。`Hashtable ` 和 JDK1 . 8 之前的 `HashMap ` 的底层数据结构类似都是采用 ** 数组+ 链表** 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;
449449- ** 实现线程安全的方式(重要):**
450450 - 在 JDK1 . 7 的时候,`ConcurrentHashMap ` 对整个桶数组进行了分割分段(`Segment `,分段锁),每一把锁只锁容器其中一部分数据(下面有示意图),多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
451451 - 到了 JDK1 . 8 的时候,`ConcurrentHashMap ` 已经摒弃了 `Segment ` 的概念,而是直接用 `Node ` 数组+ 链表+ 红黑树的数据结构来实现,并发控制使用 `synchronized ` 和 CAS 来操作。(JDK1 . 6 以后 `synchronized ` 锁做了很多优化) 整个看起来就像是优化过且线程安全的 `HashMap `,虽然在 JDK1 . 8 中还能看到 `Segment ` 的数据结构,但是已经简化了属性,只是为了兼容旧版本;
You can’t perform that action at this time.
0 commit comments