![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码
文章平均质量分 91
Java与大数据进阶
这个作者很懒,什么都没留下…
展开
-
ArrayBlockingQueue源码解析(基于JDK8)
文章目录1 介绍2 添加2.1 add2.2 offer2.3 put2.4 enqueue3 删除3.1 remove3.2 poll3.3 take3.4 dequeue4 其他BlockingQueue 称为堵塞队列,可以向队列中添加元素,也可以从队列中取出元素。当队列为空时,取出可以返回失败,抛出异常或者堵塞;当队列满时,添加可以返回失败,抛出异常或者堵塞。堵塞的方法分别是 put/take。生产者和消费者问题可以通过堵塞队列实现,只需要在队列为空或满的时候堵塞就行了。Throws原创 2021-05-23 16:52:48 · 112 阅读 · 0 评论 -
CopyOnWriteArrayList源码解析(基于JDK8)
文章目录1 基本属性和方法2 读3 写3.1 add3.2 remove3.3 set/clear4 迭代器5 copyOnWriteArraySetCopyOnWriteArrayList 是一种写时复制的 ArrayList,在写操作时加锁,拷贝原数组成员,在拷贝的数组上进行修改,并重置数组。该类对于读写可以并发执行,如果写线程还未重置数组,读到的是旧数据;如果已经重置,读到的是新数据。1 基本属性和方法写时使用 ReentrantLock 加锁。内部数组 array 存储数据,用 volati原创 2021-05-15 14:49:58 · 418 阅读 · 6 评论 -
ReentrantReadWriteLock源码解析(基于JDK8)
文章目录1 介绍1.1 ReentrantReadWriteLock1.2 state1.3 HoldCounter2 读锁2.1 读锁的获取2.1.1 tryAcquireShared2.1.2 fullTryAcquireShared2.1.3 readerShouldBlock2.1.4 tryReadLock2.2 读锁的释放3 写锁3.1 写锁的获取3.1.1 tryAcquire3.1.2 writerShouldBlock3.1.3 tryWriteLock3.2 写锁的释放4 锁降级1 介原创 2021-05-04 19:48:38 · 159 阅读 · 3 评论 -
ThreadLocal源码解析(基于JDK8)
文章目录1 ThreadLocalMap1.1 弱引用问题1.2 构造器1.3 set1.3.1 replaceStaleEntry1.3.2 expungeStaleEntry1.3.3 cleanSomeSlots1.3.4 rehash1.3.5 expungeStaleEntries1.3.6 resize1.4 get/remove2 ThreadLocal2.1 childValue2.2 threadLocalHashCode2.3 其他3 ThreadLocal 的简单使用ThreadLo原创 2021-04-24 21:23:49 · 193 阅读 · 0 评论 -
Semaphore源码解析(基于JDK8)
文章目录1 介绍2 tryAcquireShared3 tryReleaseShared4 构造器和其他5 使用5.1 简单使用5.2 尝试可重入5.3 直接释放1 介绍Semaphore 称为信号量,也是一个共享锁。通过一个内部类 Sync 继承 AQS,并重写了 tryAcquireShared和 tryReleaseShared。共享锁具体原理可以见我 AQS 的第二篇。AQS(二)共享锁必须给初始的资源个数 state。每次 acquire 都会减少 state,如果为 0,会堵塞;relea原创 2021-04-18 16:36:43 · 111 阅读 · 0 评论 -
CountDownLatch源码解析(基于JDK8)
文章目录1 介绍2 CountDownLatch 的方法3 总结及使用1 介绍CountDownLatch是一种AQS共享锁,可以看之前的介绍AQS(二)共享锁(基于JDK 8)CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前原创 2021-04-11 21:19:45 · 152 阅读 · 0 评论 -
ReentrantLock源码解析(基于JDK8)
文章目录1 介绍2 lock2.1 lock2.2 acquire2.3 tryAcquire3 unlock4 ReentrantLock4.1 构造器4.2 其他5 ReentrantLock 使用1 介绍前置知识,可以看AQS(一)独占锁(基于JDK 8)ReentrantLock 是一个可重入的独占锁。在独占模式中,isHeldExclusively 为 true 表示是对当前线程加锁,false 表示未加锁或者对其他线程加锁。加锁状态由 state 标识,如果为0,则说明未加锁,如果大原创 2021-04-01 21:38:47 · 172 阅读 · 0 评论 -
AQS(三)条件队列(基于JDK 8)
文章目录1 介绍1.1 Node2 await2.1 addConditionWaiter2.2 unlinkCancelledWaiters2.3 fullyRelease2.4 isOnSyncQueue2.5 checkInterruptWhileWaiting2.6 reportInterruptAfterWait3 signal/signalAll3.1 doSignal/doSignalAll3.2 transferForSignal4 总结和使用1 介绍参考: https://segmen原创 2021-03-30 21:32:42 · 519 阅读 · 0 评论 -
AQS(二)共享锁(基于JDK 8)
文章目录1 介绍2 锁的获取 acquireShared2.1 doAcquireShared2.2 setHeadAndPropagate2.3 和独占锁的比较3 锁的释放 releaseShared3.1 doReleaseShared1 介绍上一篇文章,讲了独占锁,AQS(一)独占锁(基于JDK 8),本篇只讲独占锁。某些共享锁使用的方法在独占锁中已经出现了,不再介绍,请读者自行去上面查看。在 Semaphore 中,acquire 调用的是 acquireSharedInterruptibl原创 2021-03-29 21:06:45 · 118 阅读 · 0 评论 -
AQS(一)独占锁(基于JDK 8)
文章目录1 介绍1.1 state1.2 Node1.3 模板方法1.4 其他2 锁的获取 acquire2.1 acquire2.2 addWaiter2.3 enq2.4 acquireQueued2.5 shouldParkAfterFailedAcquire2.6 cancelAcquire3 锁的释放release3.1 unparkSuccessor3.2 从尾遍历的原因(尾分叉)4 其他方法1 介绍在开始之前,先推荐一本书和两个博客,书是《Java并发实现原理:JDK源码剖析_出版社 电子原创 2021-03-28 18:06:15 · 199 阅读 · 0 评论 -
LongAdder 源码解析(基于 JDK 1.8)
文章目录1 LongAdder2 Striped64LongAdder 和 LongAccumulator 基本一致,区别在于前者默认是加法,后者会同时传入一个表达式,具体结果是通过二元表达式计算得到的。DoubleAdder 和 DoubleAccumulator 没有做什么,只是使用 Double.longBitsToDouble和 Double.doubleToRawLongBits进行 Long 和 Double 的转换,剩下的和前面两个类一样。1 LongAdderLongAdder 继原创 2021-03-16 20:15:21 · 126 阅读 · 0 评论 -
AtomicStampedReference源码解析(基于 JDK 1.8)
文章目录1 Stamped 和 Markable的比较2 介绍3 其他方法4 代码示例在 atomic 包中,有三个 Reference 相关的类:AtomicReference,AtomicStampedReference,AtomicMarkableReference。AtomicReference 无法解决 ABA 问题,而后面的两个类特别是 AtomicStampedReference 能够很好地解决 ABA 问题。ABA问题可以见我前面的文章 unsafe 介绍(二)与CAS1 Stamp原创 2021-03-15 22:32:33 · 147 阅读 · 0 评论 -
JDK 源码阅读配置
起初我看的是韩顺平老师的各种配置,现在那个视频已经不存在了,可以看别人截的屏。老师用的是 Oracle JDK 8,我发现很多类看不到,所以导入了 OpenJDK8,记录一下整个配置过程。我安装的是 JDK8,但是导入 OpenJDK 一样没有问题。可以在我的公众号获取相应的OpenJDK:Java与大数据进阶1 Settings 设置首先找到 File—Settings—Build,Execution,Deployment—Debugger—Stepping,如图。将下面的 Do not s原创 2021-03-14 18:28:14 · 146 阅读 · 0 评论 -
AtomicIntegerArray 源码解析(基于 JDK 1.8)
文章目录1 偏移量的计算2 其他3 使用AtomicIntegerArray 可以原子的更新 int[] 中某个对象。在找到数组第0个对象的偏移量之后,由于数组中每个对象是顺序排放的,可以根据对象大小计算出数组中某索引的偏移量,然后通过 Unsafe 相关的方法来获取或者修改。1 偏移量的计算假设数组中第 0 个对象的在数组中的偏移量为 x,每个对象的大小为 y,那么数组中第 i 个元素在数组中的偏移量为 x+i*y。下面是具体实现。base 表示的就是第 0 个对象的偏移量 x,scale 或者原创 2021-03-13 09:17:27 · 108 阅读 · 0 评论 -
AtomicIntegerFieldUpdater 源码解析(基于 JDK 1.8)
文章目录1 介绍2 具体实现类2.1 部分预备知识2.2 初始化2.3 Unsafe 相关3 实际使用3.1 AtomicIntegerFieldUpdater 的使用3.2 Reflection.getCallerClass()1 介绍AtomicIntegerFieldUpdater 是将某个类 T 的某个 int 属性包装一下,使得该属性能够在多线程中保持原子性。具体使用可见第三节。有如下的要求:只能修改对于其可见的字段;目标类的操作字段必须被volatile关键字修饰;目标类原创 2021-03-12 19:10:03 · 115 阅读 · 0 评论 -
AtomicInteger 源码解析(基于 JDK 1.8)
文章目录1 介绍2 初始化和 get/set3 原子操作1 介绍AtomicInteger 是一个原子类,增加和删除是原子性的,避免外界直接使用 Unsafe 来实现原子操作。实现原子性的原理是 CAS,具体可见我前面的文章。 unsafe 介绍(二)与CAS成员变量 value 是 volatile 的,保证可见性。Volatile 介绍public class AtomicInteger extends Number implements java.io.Serializable {原创 2021-03-10 08:53:02 · 163 阅读 · 0 评论 -
unsafe 介绍(二)与CAS
文章目录1 CAS 介绍1.1 定义1.2 ABA 问题2 Unsafe 中的CAS2.1 基本方法2.2 扩展方法2.3 解释在 Oracle JDK 8 中,找不到 unsafe.java,在 idea 中只能由 unsafe.class 反编译得到一个 unsafe.java。解压openjdk-8u41-src-b04-14_jan_2020.zip,查看 .\openjdk\jdk\src\share\classes\sun\misc\unsafe.java。这里我也将 unsafe.jav原创 2021-03-08 22:23:52 · 124 阅读 · 0 评论 -
Unsafe 介绍(一)
文章目录1 初始化2 获取unsafe3 get/put4 堆外内存4.1 分配4.2 赋值4.3 释放4.4 内存大小4.5 使用5 类/对象/数组5.1 对象5.2 类5.3 数组5.4 使用6 线程6.1 介绍6.2 使用7 内存屏障8 CAS9 其他10 unsafe 源码在 Oracle JDK 8 中,找不到 unsafe.java,在 idea 中只能由 unsafe.class 反编译得到一个 unsafe.java。解压openjdk-8u41-src-b04-14_jan_2020.原创 2021-03-05 16:32:50 · 491 阅读 · 0 评论 -
Volatile 介绍
文章目录1 介绍2 Java 内存模型 JMM3 特性3.1 可见性3.2 有序性3.3 不保证原子性本文主要参考 《Java并发编程的艺术》以及一些博客1 介绍如果一个变量用了volatile修饰,那么这个变量是对所有线程共享的、可见的,每次jvm都会读取最新写入的值并使其最新值在所有CPU可见。当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。2原创 2021-03-03 10:38:40 · 386 阅读 · 2 评论 -
LinkedHashMap 源码解析(基于 JDK 1.8)
文章目录1 主要属性2 构造器3 钩子函数的实现3.1 afterNodeAccess3.2 afterNodeRemoval3.3 afterNodeInsertion4 removeEldestEntry5 get6 put 相关6.1 putVal6.2 linkNodeLast7 remove8 迭代器源码环境: JDK 1.8LinkedHashMap 是 HashMap 的子类,在 HashMap 的基础上,对于每一个出现的节点 Node e,用双向链表来连接。可以理解为 LinkedHas原创 2021-02-24 15:50:16 · 170 阅读 · 0 评论 -
HashMap 源码解析(基于 JDK 1.8)
文章目录1 常用变量及节点类2 构造器及 tableSizeFor3 put相关方法3.1 put/putIfAbsent/putAll3.2 putMapEntries3.3 hash3.4 putVal3.5 resize4 get 相关4.1 get/getOrDefault4.2 getNode5 remove 相关5.1 remove5.2 removeNode6 replace7 钩子函数8 键值对集合9 迭代器源码环境: JDK 1.8。本文不介绍红黑树节点的处理过程。在 1.8 中,H原创 2021-02-22 11:13:55 · 144 阅读 · 1 评论 -
LinkedList 源码解析(基于 JDK 1.8)
文章目录1 成员变量和 Node2 构造器3 预备方法3.1 linkFirst3.2 linkBefore3.3 unlink3.4 unlinkFirst3.5 其他4 add 相关4.1 add4.2 addAll4.3 offer5 remove6 get/set7 迭代器7.1 迭代器7.2 反向迭代器源码环境: JDK 1.8。关键的算法用 gif 图进行描述。如果大家对画图或者 gif 工具有建议,欢迎在评论区评论。1 成员变量和 Node链表节点是 Node,Node 包含 ite原创 2021-02-19 15:22:13 · 106 阅读 · 0 评论 -
ArrayList 源码解析(基于 JDK 1.8)
文章目录ArrayList 源码解析1 主要属性2 构造器3 add以及扩容3.1 add3.2 addAll3.3 扩容相关4 remove5 get/set6 迭代器6.1 迭代器6.2 列表迭代器ArrayList 源码解析源码环境: JDK 1.8首先介绍读源码的方法,有些构建的方法会将源码整体编译,造成卡顿,需要加大 Build process heap size。这里不将源码拷贝到src,具体见韩顺平的源码阅读配置视频:韩顺平源码视频,或者别人做的视频截图:自制截屏PPT看源码主要看属性原创 2021-02-17 21:20:42 · 89 阅读 · 0 评论