![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java 源码分析
文章平均质量分 84
JDK源码、框架源码
llzcxdb
欢迎来到我的个人博客
Github:https://github.com/llzcx
展开
-
【Java】对于JDK1.8 HashMap中扩容机制的理解(深入源码)
NEW_MASK会比原来的在高位(我们暂时称为这个位为high)多一个1,对于hash1来说,hash1在high上的1就被保留了,而MASK却不能留下这个1。2次按位与计算的结果不同,所以扩容以后该key需要移动到新的插槽,并且新的插槽位置是可以提前知道的。对于hash2来说,high上本来就是0,所以2次按位与运算的结果都一样,所以扩容以后该key无需移动到新的插槽。继续观察可以发现旧容量oldCap在high上刚好为1,然后你就可以理解下面代码中对于某个old插槽来说怎么迁移key了:(e原创 2023-12-26 20:54:48 · 1059 阅读 · 1 评论 -
【JUC】Reentrantlock源码分析
AQS是并发容器J.U.C(java.util.concurrent)下locks包内的一个类。它实现了一个FIFO的队列。底层实现的数据结构是一个双向链表。AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。AQS使用一个int成员变量来表示同步状态,通过内置的FIFO。原创 2023-12-19 21:45:52 · 795 阅读 · 1 评论 -
【Java】ThreadLocal源码分析
TheadLocal底层通过Thead.currentThread获取每个thread对象的ThreadLocalMap,Set(T)方法会将Threadlocal对象本身作为key值,T作为value存入map当中。ThreadLocalMap的插槽继承了WeakReference,并调用了父类的构造方法让key变成弱引用。ThreadLocalMap底层实现为Entry数组+线性探测法,负载因子为2/3。原创 2023-12-18 22:56:49 · 445 阅读 · 1 评论 -
【Java】Java的Integer.bitCount()源码分析
已经将高4位全部设置为0,而存储16位只需要5个位(10000),在此之前最多占用了4个位,就算不抹除高8位(& 0x00ff00ff)也不影响。偶数位1的数量:(i >>> 1) & 0x55555555,偶数位右移到奇数位,原偶数位被按位与抹掉。与上面类似,而存储32位只需要6个位(100000),距离上次清理来说,还有2个位可用(一个8个)。& 0x55555555的作用:保留奇数位,去除偶数位。目的:对于每2位,存储1的数量。目的:对于每4位,存储1的数量。目的:对于每8位,存储1的数量。原创 2023-11-24 22:55:11 · 362 阅读 · 1 评论