| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Java——》ConcurrentHashMap -> 正文阅读 |
|
[数据结构与算法]Java——》ConcurrentHashMap |
一、存储结构JDK1.7:数组 + 链表
1、链表长度到8,一定会转换为红黑树吗?答案:必须达到数组长度>=64,并且某一个桶下的链表长度到8,才会转换为红黑树 1)ConcurrentHashMap规定数组长度:642)HashMap规定数组长度:642、为什么链表长度为8,才会转为红黑树?原因:泊松分布(概率学) 3、红黑树什么情况下会转换为链表?答案:链表长度为6时,才可能会转换为链表 二、散列算法
1、散列算法相关源码2、散列算法介绍
第一步:hh = key.hashCode(),是一个int类型值 第二步:h >>> 16h >>> 16,表示无符号右移16位 第三步:h ^ (h >>> 16)h ^ (h >>> 16),表示进行 ^运算(相同为0,不同为1) 第四步:(h ^ (h >>> 16)) & HASH_BITSHASH_BITS = 0x7fffffff ,是一个16进制值 3、散列算法中为什么要执行一个&运算?&运算的目的是为了保证hash值一定是正数,因为hash值为负数有特殊含义
1)MOVED相关源码2)RESERVED相关源码三、保证安全的方式1、Hashtable实现方式:方法追加上 **synchronized **保证线程安全(速度巨慢) 2、JDK1.7的ConcurrentHashMap实现方式:使用分段锁 **Segment **,原理就是ReentrantLock。 3、JDK1.8的ConcurrentHashMap:实现方式:基于 **CAS **和 **synchronized **同步代码块实现的线程安全 四、扩容1、sizeCtl
表初始化和调整大小控件。
sizeCtl = -1:代表当前ConcurrentHashMap的数组正在初始化 数组初始化相关源码2、ConcurrentHashMap扩容触发条件1)数组长度达到了扩容的阈值(阈值 = 数组长度 * 负载因子 = 64*0.75) 以上场景,ConcurrentHashMap会触发helpTransfer(),也就是多线程扩容。 3、扩容戳介绍扩容戳是一个负数 因为在扩容时,是基于原数组的长度来做计算的,所以在扩容时,需要保证多个线程扩容是的长度都是一样的。 4、扩容步骤
假如现在要从32扩容到64,n = 32 第一步:Integer.numberOfLeadingZeros(n)n前面有几个0,32前面有26个0 第二步:(RESIZE_STAMP_BITS - 1)RESIZE_STAMP_BITS - 1 = 16 - 1 = 15 第三步:1 << (RESIZE_STAMP_BITS - 1)1往左移 15位 第四步:Integer.numberOfLeadingZeros(n) | (1 << (RESIZE_STAMP_BITS - 1))32的二进制 :00000000 ?00000000 ?00000000 ?00100000? 第五步:rs << RESIZE_STAMP_SHIFTrs左移16位 第六步:(rs << RESIZE_STAMP_SHIFT) + 2rs<<16的二进制:?10000000 ?00011010? 00000000 ?00000000 5、扩容流程假如现在要从32扩容到64,n = 32 6、lastRun机制提前将链表数据进行计算,算出链表的节点需要存放到哪个新数组位置,将不同位置算完打个标记
7、老数组数据放到新数组的哪个位置:::info 如果e.hash的二进制 :01010101 01010101 01010101 01010101 如果e.hash的二进制 :01010101 01010101 01010101 01000101
8、ConcurrentHashMap扩容处的BUGhttps://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8214427 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:05:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |