Java学习总结(1.3.2) 并发容器类

精贴 置顶
1741 0
作者:      发布时间: 2020-04-07 16:15:03

JDK源码学习方法更重要

逻辑思维能力是梳理学习方法的基础。养成线性思维:两个或者多个概念,像一条线串起来。

1)演绎推导法

示例:因果推理。因为JAVA中网络编程只提供了BIO和NIO两种方式,所以一切框架中,涉及到网络处理的,都可以用这两个知识点去探究原理。

2)归纳总结法

示例:可能正确的猜想。线上10台服务器,有三台总是每天会自动重启,收集相关信息后,发现是运维在修改监控系统配置的时候,漏掉了提高这三台机器的重启阈值。

3)类比法

集群概念就好像是马在拉车,一匹马拉不动的时候,就使用多匹马去拉分布式的概念,就像是理发的过程中,洗头发和剪头发是不同的人负责的。



HashMap源码解析

JDK1.7存储方法,初始一定长度的数组,每个数组以链表方法存储多个数据。

数组的初始长度 16,根据数据的数量进行扩容。

扩容阈值(两倍扩容)

扩容性能不好,可以初始化避免扩容

JDK1.8:不同地方,链表长度为8之后,转用红黑树


Hashtable

线程安全,但是锁粒度太大,锁住了整个的集合,并发度太低,性能不好。

Hashtable是一个比较重的数据结构,所以你井不能为了追求并发多的Hashtable。

一个Hashtable,也就是一个分段,里面存储的数据会比较多,一个分段锁是一个比较大粒度的锁。

JDK1.8里面,对链表加锁。

链表星一个比较轻的数据结构,每个链表存放的数据很少,一般在锁的粒度比较小并发度就很高。


锁住链表的头部,就是锁住整个链表线程也是安全的。

这样额做法,和DK1.7的分段锁,有什么区别?

JDK1.7每个分段都会有很多的数据,锁的粒度虽然比Hashtable要好,仍然还是粒度很多,并发度是一定的。

JDK1.8中是链表,链表的粒度非常小,并发度相对来说就大很多,而且不固定, table扩容,链表增多,并发度就更高


ConcurrentHashMap

线程安全

JDK1.7是分段锁










标签:

每日一句

如果你能每天呐喊二十一遍「我用不着为这一点小事而烦恼」,你会发现,你心里有一种不可思议的力量。

标签云

vue
最近综合
情绪巨婴是什么 12.18
普通蛋糕做法 05.31
玉米烤肠芝士面包做法 05.31
Mysql安装教程 - 绿色版 06.18
我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
Typora开发版⽆法使⽤解决⽅法 05.04
为什么无知者越自信? -- 达克效应 05.10
马斯洛需求层次理论 04.29
随机综合
为什么无知者越自信? -- 达克效应 05.10
中间件1.2.1-ActiveMQ入门 04.22
Microsoft Edge和Google Chrome的STATUS_INVALID_IMAGE_HASH 07.06
Java学习总结(2.2.2) 责任链模式 04.20
鸿蒙OS代码正式开源 09.11
iPhone 6与iPhone 6 Plus正式开放预订 09.17
android 一个Activity跳转到另一个Activity,并数值传递的方法 04.28
Spring返回json可以跨域设置 08.21