Java
土豆菜任性
这个作者很懒,什么都没留下…
展开
-
对着源码一步步分解AQS
对着源码来一步步分析AQS的实现逻辑,AQS->AbstractQueuedSynchronizer,看名字 抽象队列同步器,首先得有队列。 先来看队列节点类,Node: static final class Node { static final Node SHARED = new Node(); //共享模式标记 static final Node EXCLUSIVE = null;//独占模式标记 static原创 2020-12-04 12:59:44 · 153 阅读 · 0 评论 -
JDK8---UnSafe类实现CAS乐观锁
CAS:CompareAndSwap(比较并交换),简单点说,内存地址V,旧值为A,当要修改为新值B的时候,先判断V当前的值是不是A,如果是,则将V的值修改为B,否则失败。 那么JDK8中是怎么实现的呢?(ConCurrentHashMap、Atomic、AQS等常见并发类的底层实现都有它) 在sun.misc包下有一个 UnSafe类(在rt.jar包下面): public final class Unsafe { private Unsafe() {//静态构造方法 } public原创 2020-12-04 12:47:48 · 233 阅读 · 0 评论 -
看一看1.8的HashMap---插入、查找
再看之前,需要先理解位移 先看位移运算,按照我们的日常使用-从new开始,来一步步分析源代码。(核心源码每一步都有注释) 第一步:Hash构造函数 主要两类;第一类,不指定初始化容量 public HashMap() { this.loadFactor = 0.75F; } 第二类,指定初始容量和负载因子 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0)原创 2020-12-04 12:41:33 · 217 阅读 · 0 评论 -
先看位移运算
初识: <<(左移)、>>(带符号右移)和>>>(无符号右移) (符号: 最高位 0 正数,1负数)。注意当刚好为数据长度的整数倍时,即32、64······,数据保持原来不变;其他情况下移动除以 32 余数的长度。 <<:例如 5<<1 -> 二进制为 0101 整体左移一位,缺的以0补足,变成 101 0 = 10 相当于 5 * 2 = 10。 >>:例如 10>>1 ->二进制为 1010 整体原创 2020-12-04 12:29:54 · 111 阅读 · 0 评论