File tree Expand file tree Collapse file tree 3 files changed +3
-3
lines changed Expand file tree Collapse file tree 3 files changed +3
-3
lines changed Original file line number Diff line number Diff line change @@ -786,7 +786,7 @@ dynamic-hz yes
786
786
因为不太好办到,或者说这种删除方式的成本太高了。假如我们使用延迟队列作为删除策略,这样存在下面这些问题:
787
787
788
788
1 . 队列本身的开销可能很大:key 多的情况下,一个延迟队列可能无法容纳。
789
- 2 . 维护延迟队列太麻烦:修改 key 的过期时间就需要调整期在延迟队列中的位置 ,并且还需要引入并发控制。
789
+ 2 . 维护延迟队列太麻烦:修改 key 的过期时间就需要调整其在延迟队列中的位置 ,并且还需要引入并发控制。
790
790
791
791
### 大量 key 集中过期怎么办?
792
792
Original file line number Diff line number Diff line change @@ -445,7 +445,7 @@ Test.parallelStream avgt 5 186345456.667 ± 3210435.590 ns/op
445
445
446
446
`ConcurrentHashMap ` 和 `Hashtable ` 的区别主要体现在实现线程安全的方式上不同。
447
447
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 的主体,链表则是主要为了解决哈希冲突而存在的;
449
449
- ** 实现线程安全的方式(重要):**
450
450
- 在 JDK1 . 7 的时候,`ConcurrentHashMap ` 对整个桶数组进行了分割分段(`Segment `,分段锁),每一把锁只锁容器其中一部分数据(下面有示意图),多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。
451
451
- 到了 JDK1 . 8 的时候,`ConcurrentHashMap ` 已经摒弃了 `Segment ` 的概念,而是直接用 `Node ` 数组+ 链表+ 红黑树的数据结构来实现,并发控制使用 `synchronized ` 和 CAS 来操作。(JDK1 . 6 以后 `synchronized ` 锁做了很多优化) 整个看起来就像是优化过且线程安全的 `HashMap `,虽然在 JDK1 . 8 中还能看到 `Segment ` 的数据结构,但是已经简化了属性,只是为了兼容旧版本;
Original file line number Diff line number Diff line change 33
33
34
34
虚拟机规范上面这 3 点并不具体,因此是非常灵活的。比如:"通过全类名获取定义此类的二进制字节流" 并没有指明具体从哪里获取( ` ZIP ` 、 ` JAR ` 、` EAR ` 、` WAR ` 、网络、动态代理技术运行时动态生成、其他文件生成比如 ` JSP ` ...)、怎样获取。
35
35
36
- 加载这一步主要是通过我们后面要讲到的 ** 类加载器** 完成的。类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载由 ** 双亲委派模型** 决定(不过,我们也能打破由双亲委派模型 )。
36
+ 加载这一步主要是通过我们后面要讲到的 ** 类加载器** 完成的。类加载器有很多种,当我们想要加载一个类的时候,具体是哪个类加载器加载由 ** 双亲委派模型** 决定(不过,我们也能打破双亲委派模型 )。
37
37
38
38
> 类加载器、双亲委派模型也是非常重要的知识点,这部分内容在[ 类加载器详解] ( https://javaguide.cn/java/jvm/classloader.html " 类加载器详解 ") 这篇文章中有详细介绍到。阅读本篇文章的时候,大家知道有这么个东西就可以了。
39
39
You can’t perform that action at this time.
0 commit comments