
jdk源码
文章平均质量分 75
java底层源码解读,大都是基于jdk14的源码。
诗水人间
要想走的更远,就需要思考更深层次的问题。冷静、智慧、深沉是我所向往的
展开
-
AbstractQueuedSynchronizer源码解读---完整版注释
完结AQS源码解读(完整版)package java.util.concurrent.locks;/** * jdk14 完结 */import jdk.internal.misc.Unsafe;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.原创 2020-11-12 22:29:54 · 41540 阅读 · 0 评论 -
以ReentrantLock的非公平锁为例深入解读AbstractQueuedSynchronizer源码
以下面这段代码为例,我们分析以下ReentrantLock的工作原理,聊一聊,ReentrantLock到底做了哪些事情!public class ReentrantLockTest { static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new Thread(()->{ lock.lock();原创 2020-11-05 02:15:21 · 47751 阅读 · 2 评论 -
深入ReentrantLock源码与解读
学习忠告ReentrantLock的源码涉及到的类比较多,如果想真正掌握ReentrantLock的原理,建议独自去阅读源码,会有更好的效果。课前小菜我们都知道ReentrantLock简称(可重入锁),我们也知道ReentrantLock可以实现非公平锁和公平锁机制(转载的一篇公平锁和非公平机制)。默认(指无参构造得到的ReentrantLock实例)是非公平锁,通过有参构造器传入一个boolean值,如果传入true则是公平锁。源码见真章:在阅读ReentrantLock前,我们将Ree原创 2020-11-03 04:22:47 · 45217 阅读 · 1 评论 -
ThreadLocal源码的解读--内存泄漏原理,以及处理方式
第一要提到的内容、ThreadLocal的常规使用( 后面有彩蛋!)使用set(T value)方法将值存入ThreadLocalMap,如果map不存在,则进入set()内部的else分支创建一个ThreadLocalMap并将值value存入map,在创建的过程中会将这个map保存到当前线程对象的成员属性上然后调用get()方法获取值,get()内部会先从线程对象取出ThreadLocalMap,然后再取出其中的值,并返回使用完后我们需要调用remove()方法清除ThreadLocalMap原创 2020-09-26 02:59:09 · 72643 阅读 · 3 评论 -
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList
一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之ArrayList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之LinkedList一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashMap一文搞定ArrayList、LinkedList、HashMap、HashSet -----源码解读之HashSet 一、ArrayList 源码原创 2020-07-29 04:39:23 · 110228 阅读 · 0 评论 -
如何更优雅的使用 Java8 进行分组(尤其是多个字段的组合分组)。
在SQL中经常会用到分组,我们也常常遇到一些组合分组的场景。有下面的一个User类。原创 2022-07-17 07:53:01 · 12902 阅读 · 2 评论 -
是使用Thread.sleep(200) 还是使用 LockSupport.parkNanos(200*1000*1000l) ?
相信这个问题很少人会想过问这个问题,但是看到相关文章后定然是新奇。我相信有很多人都知道LockSupport 这个工具类,但绝大多数人学JUC都只是处于应用JUC。没有对底层原理思考。那么在我提出这个问题的时候,你能说出其中的一二吗?Thread.sleep 与 LockSupport.parkNanos 两者现象都能让线程暂停下来,但是底层的原理有所区别。在java类库中2个方法都标有相应的注释,注释中解释到: sleep 虽然让线程暂停了,但是不会释放资源,而LockSupport.park会释原创 2022-03-27 05:12:45 · 4839 阅读 · 0 评论 -
并发工具类 java.util.concurrent.Phaser 移相器 你是否熟练掌握了呢?
下面这张图,看完文章后再看,主要意图在于再次看到文章后能快速回忆state值的说明。原创 2021-09-26 11:54:42 · 734 阅读 · 1 评论 -
深入解读Collectors集合收集器
Collectors 要和 Stream-API 结合起来才能起到效果前置文章推荐:建议先掌握 stream api 后再来看《java8 Stream接口的深入解读,stream接口内部的方法你都熟悉吗?》Collectors 是java.util.stream下的工具类因此Collectors的主要用途是收集stream中的元素。常用的方法有toList()、toSet()toMap(Function, Function)toMap(Function, Function, Binary原创 2021-09-21 15:50:18 · 1300 阅读 · 0 评论 -
反射工具类jdk.internal.reflect.Reflection 源码解读和总结
在读完jdk.internal.reflect.Reflection类源码时,掌握了几个知识点。第一点、Reflection类的应用场景今天突发好奇Class.forName(String)方法。因为对于反射已经相当熟悉了,但是对于这个方法一直没有深究下去,好奇心驱使下,就点进去看了一下,发现这行代码很新奇。这行代码的含义很简单,就是为了获取调用该方法的class需要注意的是,他会忽略方法代理的栈帧调用忽略java.lang.reflect.Method.invoke()栈帧调用总的来说也就是原创 2021-09-09 22:54:48 · 1058 阅读 · 0 评论 -
PriorityQueue 求解topk问题
java的底层结合了很多数据结构的变化,随着时代的进步,java也与时俱进。HashMap中的红黑树、AQS中的CLH队列、内置的堆栈工具类。大小堆算法常常用于计算topk问题求解问题,而java实际上就已经帮我们写好了,并且集成进jdk类库中。topk问题可以用下面的优先队列来求解,默认下使用的是最小堆,可以通过传入比较器Comparator 接口来实现最大堆的求解。PriorityQueue示例代码如下:import java.util.ArrayList;import java.uti原创 2021-07-12 15:29:00 · 453 阅读 · 0 评论 -
HashTable源码解读
面试过程中HashTable是一个常考的知识点常常会将HashMap 或 ConcurrentHashMap进行比较。今天特意看了一下 HashTable源码总结了几个常考知识点一、初始容量11,最大容量为 231-8HashMap和ConcurrentHashMap默认初始容量是16。而HashTable是11默认的扩容因子都是0.75,也都是2倍的方式进行扩容下面是它的构造方法如下// 最大容量private static final int MAX_ARRAY_SIZE = Int原创 2021-07-14 17:32:13 · 266 阅读 · 3 评论 -
论源码阅读的必要性。JDK14SourceCodeInterpretation
论源码阅读的必要性 自己曾经学过很多技术框架,学着学着,有些时候就会困惑。①为什么要学这些技术框架? 在大学这几年,我一直坚持每天学习,学着学着感觉市面上的框架基本上都学完了,至少在技术方面上已经不再是一个问题了。随着自己技术水平的不断增加,越发的觉得技术底层的原理重要性。 很多时候我也有疑惑,同样敲代码,凭什么人家能拿高薪,凭什么人家叫高级java开发工程师?自己与其他人的差别到底在哪里,框架用的六不六?。细想一下,框架使用的灵活不灵活并不能说明一个人的能力。学习框架的时候你是否也有疑原创 2021-05-27 22:54:19 · 833 阅读 · 13 评论 -
谈一谈 spring、springboot环境下字符串的判空,以及 java8的对象判空
StringUtils spring以及springboot项目是经典的web应用框架,在web应用中经常会从前端传来用户输入的数据。可以使用spring提供的工具类:org.springframework.util.StringUtils下面是判空以及对于一些没有实际意义的字符串的判断System.out.println(StringUtils.hasText(null)); // falseSystem.out.println(StringUtils.hasText(""));原创 2021-01-17 05:24:13 · 6142 阅读 · 2 评论 -
深入解读ReentrantLock中的Condition接口的实现类ConditionObject
前不久在给网友讲JUC源码,我布置了一些作业让他们做,我看到了他们返回给我的作业中在谈到Condition接口的方式对线程对象阻塞和唤醒的理解有点偏差。我布置的作业内容是让他们回答,超类Object、Condition接口、LockSupport 三种方式对线程进行阻塞和唤醒,它们各自的优点、缺点、特点其中讲到Condition接口的特点: 有网友回答我说Condition的使用依赖于ReentrantLock,必须通过ReentrantLock.newCondition()方法获取到Cond原创 2021-01-06 02:39:54 · 820 阅读 · 0 评论 -
JDK7的HashMap源码和注释
前段时间给jdk14中的HashMap加过注释,最近看到6000多行的ConcurrentHashMap有点畏惧了,再则了解到 jdk8 开始ConcurrentHashMap取消了分段锁机制,然后看到jdk7的ConcurrentHashMap大概有1600行去掉自带的注释就大概1000来行,nice,打算看下jdk7的ConcurrentHashMap然后再过度到jdk8以后的版本。进行前后对比学习,顺便看下7中的HashMap源码,后期再把7和14的源码加注释看过源码后自己总结一些知识点:底层采原创 2020-12-23 07:07:09 · 761 阅读 · 1 评论 -
Ubuntu20.04.1环境编译openjdk15
本来想在windows环境下编译openjdk15,奈何windows非常麻烦,各种依赖需要一个一个找还找不齐,linux上只需要使用命令安装依赖即可,因此选择了ubuntu作为环境。首先需要有一台Ubuntu主机,我这里使用Vmware安装一台Ubuntu虚拟机Ubuntu桌面版镜像下载地址:https://ubuntu.com/download/desktop 到下载页面下载好桌面版的ubuntu即可然后 通过ubuntu镜像在VMware上创建一台虚拟机创建完成我们进入主题一、下载jdk(原创 2020-12-04 19:23:10 · 24705 阅读 · 5 评论 -
ReentrantReadWriteLock源码注释
AbstractQueuedSynchronizer是JUC底层的架构,也是JUC的重点要掌握的内容如果对AQS的原理和源码还不清楚可以看下我之前写的文章:以ReentrantLock的非公平锁为例深入解读AbstractQueuedSynchronizer源码AbstractQueuedSynchronizer源码源码注释,版本jdk14,如果是jdk8,部分源码可能不同,笔者认为,像这种源码的学习,看高版本的有助于学习先进思想,当然jdk8的源码也可以看,建议选择一个版本看即可,先掌握原理,原创 2020-11-25 19:46:02 · 28352 阅读 · 0 评论 -
ReentrantReadWriteLock常见问题,源码级别的讲解
ReentrantReadWriteLock源码注释ReentrantReadWriteLock中利用state的前16位表示读锁、后16位表示写锁而下面图片源码如果出现w就代表写锁的个数,r是读锁的个数写锁加锁失败的情况读锁没有释放,加写锁则会失败下面的方法是尝试加写锁时会执行的方法,判断的方法如下public final void acquire(int arg) { if (!tryAcquire(arg)) { // 尝试加锁,失败则需要进入队列 acquir原创 2020-11-25 04:34:08 · 29122 阅读 · 0 评论 -
java.util.concurrent.locks.ReentrantReadWriteLock源码的解读和注释
ReentrantReadWriteLock源码注释总结:state表示了读锁和写锁的上锁次数,前16为用来表示读锁次数,后16为表示写锁次数读读不加锁写读、写写会导致加锁import java.util.Collection;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.u原创 2020-11-24 05:32:51 · 42189 阅读 · 0 评论 -
以读写锁ReentrantReadWriteLock的读锁为例追踪源码
读写锁适合使用在读多写少的场景,如果写多读少,反而没有可重入锁的效率高,一般而言,能够使用读写改造的情况下,使用读写锁效率会更高。下面是一个读写锁的读锁使用案例class ShareData { private Integer num = 0; private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); /** * get方法 */ public Integer getNum原创 2020-11-24 05:01:31 · 31682 阅读 · 1 评论 -
java.util.concurrent.CyclicBarrier类的源码和总结
下面是我对CyclicBarrier 类的注释内容CyclicBarrier 类比较简单,前提需要掌握ReentrantLock原理如果感觉没看够在juc专栏中找,关于ReentrantLock我写了好几篇博客,有详细的说明。总结:内部实际上通过ReentrantLock控制线程以及通过ReentrantLock得到Condition接口,通过condition控制线程CyclicBarrier的使用则是通过new CyclicBarrier(10)表示可以拦截10个线程,然后在多线程中通过awai原创 2020-11-21 04:43:19 · 32197 阅读 · 0 评论 -
AtomicMarkableReference源码
AtomicMarkableReference和 AtomicStampedReference源码几乎相同,唯一区别就在于一个是int型的时间戳,而这个类则是布尔型的标记值。两者区别在于AtomicStampedReference可以知道修改了多少次,而AtomicMarkableReference则只知道有没有被修改过import java.lang.invoke.MethodHandles;import java.lang.invoke.VarHandle;public class Atomi原创 2020-11-12 00:52:31 · 56189 阅读 · 0 评论 -
AtomicStampedReference的源码
在我们使用CAS操作的时候会有一个问题那就是CAS过程中,预期值可能被更新了多次,最终又更新会预期值,这样判断cas操作则是成功的因为本次cas操作符合条件。AtomicStampedReference总的来说就是解决一个线程将A改成C,也就是说当前值是A。但是会出现A被改成B后又改回A,那么A改成C还是成功的。有些时候是不允许这种情况。因此有了AtomicStampedReference类,它在CAS的基础上加了一个时间戳的概念,实际上就是在原先需要预期值和新值,两个参数,现在需要另外加两个参数也就是原创 2020-11-12 00:41:13 · 56084 阅读 · 0 评论 -
简化 java.util.concurrent.CopyOnWriteArraySet 源码并总结知识点
通过查看源码会发现CopyOnWriteArraySet 底层用的是CopyOnWriteArrayList因此我们需要借鉴CopyOnWriteArrayList的源码资料:简化 java.util.concurrent.CopyOnWriteArrayList 源码并总结知识点会发现CopyOnWriteArraySet会比CopyOnWriteArrayList代码量少一些,因为本质就是给CopyOnWriteArrayList套了一层壳。这里我们需要思考的问题是Set是一个元素不重复的集合原创 2020-11-07 00:37:55 · 56724 阅读 · 0 评论 -
简化 java.util.concurrent.CopyOnWriteArrayList 源码并总结知识点
由于CopyOnWriteArrayList比较重要,这里我没有像以前一样直接删除方法体内部,而是保留主要方法并添加了注释通过观看源码,CopyOnWriteArrayList 和 ArrayList有一些明显的特点没有resize扩容,而是通过牺牲空间来提高并发性能的特点(写时拷贝原理)CopyOnWriteArrayList在较新版本的jdk不是使用ReentrantLock加锁,而是使用Synchronized加锁(底层做了优化Synchronized的效率高于ReentrantLock故新版原创 2020-11-07 00:21:45 · 53476 阅读 · 0 评论 -
ReentrantLock和AbstractQueuedSynchronizer的整体结构
去掉定义的方法,AQS和可重入锁留下了哪些结构?AbstractQueuedSynchronizer简化后的大致结构public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { private static final long serialVersionUID = 7373984972572414691L; // 序列原创 2020-11-05 02:17:24 · 44726 阅读 · 0 评论 -
运行时常量池的一道面试题(jdk8环境)
事先说明环境 在jdk8下,高版本的jdk可能找不到对应的Version类代码:public class TestDemo { @Test public void test01() { // String str1 = new StringBuilder("hello").append("World").toString(); System.out.println(str1.intern()); System.ou原创 2020-10-21 03:57:35 · 89359 阅读 · 4 评论 -
java.util.concurrent.CountDownLatch 类的源码和解读
源码注释public class CountDownLatch { private final Sync sync; // 同步器 /** * 同步控制计数器 */ private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L;原创 2020-10-15 00:55:05 · 69668 阅读 · 0 评论 -
简化 java.util.concurrent.locks.LockSupport 类的源码
关于LockSupport原理看源码注释。总的来说LockSupport提供外部使用的是静态方法park()、unpark(Thread thread)分别是让线程阻塞和唤醒线程的两个方法而底层则是调用C写好的库Unsafe类实现线程的调度。这个类在juc包下的很多类中都有用到。需要了解即可。概括的说我们用Unsafe通过jvm操作线程,而jvm则是通过操作系统操作线程。unpark、和park前后顺序(先阻塞,还是先唤醒)的一个坑,找到该文章的LockSupport案例import jdk原创 2020-10-14 22:11:35 · 58131 阅读 · 0 评论 -
java.util.concurrent.Semaphore 类源码的深入解读
源码先贴上,后面是实际使用的时候代码的执行流程import java.util.Collection;import java.util.concurrent.TimeUnit;public class Semaphore implements java.io.Serializable { private static final long serialVersionUID = -3222578661600680210L; // 序列化版本号 private final Sync sy原创 2020-10-14 10:53:50 · 74451 阅读 · 0 评论 -
简化 java.lang.Boolean 类的源码
public final class Boolean implements java.io.Serializable, Comparable<Boolean> { @java.io.Serial private static final long serialVersionUID = -3665804199014368530L; // 序列化版本号 public static final Boolean TRUE = new Boolean(true);原创 2020-09-28 03:36:09 · 94198 阅读 · 0 评论 -
简化 java.lang.Short 类的源码
Short和Byte、Integer、Long一样由缓存值-128 ~ 127public final class Short extends Number implements Comparable<Short> { @java.io.Serial private static final long serialVersionUID = 7515723908773894738L; // 序列化版本号 public static final short MIN_VA原创 2020-09-28 03:19:58 · 74107 阅读 · 0 评论 -
简化 java.lang.Byte 类的源码
public final class Byte extends Number implements Comparable<Byte> { @java.io.Serial private static final long serialVersionUID = -7183698231559129828L; public static final byte MIN_VALUE = -128; // 缓存最小值 public static fi原创 2020-09-28 03:00:07 · 82267 阅读 · 0 评论 -
简化 java.lang.Long 类的源码
对源码进行了整理和排序加注释,方法体直接删除。除了部分重要代码我进行了保留public final class Long extends Number implements Comparable<Long>, Constable, ConstantDesc { @java.io.Serial @Native private static final long serialVersionUID = 4290774380558885855L;// 序列化版本号 @Nati原创 2020-09-28 02:20:27 · 71965 阅读 · 0 评论 -
简化 java.util.ArrayList 类的源码
后面的迭代器类的源码功能都差不多,可以不用看重点掌握前面的方法和成员属性。public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { @java.io.Serial private static final long serialVersionUID = 868345258112原创 2020-09-26 22:27:28 · 77250 阅读 · 0 评论 -
简化 java.util.LinkedList 类的源码
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { @java.io.Serial private static final long serialVersionUID = 876323262645176354L; // 序列化版本号 tr原创 2020-09-26 13:35:37 · 88173 阅读 · 0 评论 -
简化 java.lang.Double 类的源码
public final class Double extends Number implements Comparable<Double>, Constable, ConstantDesc { @java.io.Serial private static final long serialVersionUID = -9172774392245257468L; //序列化版本号 private final double value; // 实际存储double数据原创 2020-09-25 23:20:36 · 81969 阅读 · 0 评论 -
简化 java.lang.Float 类的源码
public final class Float extends Number implements Comparable<Float>, Constable, ConstantDesc { @java.io.Serial private static final long serialVersionUID = -2671257302660747028L; // 序列化版本号 private final float value;原创 2020-09-25 22:57:20 · 70776 阅读 · 0 评论 -
简化 java.lang.Integer 类的源码
Interger在面试中也会经常遇到,关于面试题中遇到的问题在下面注释中有说明public final class Integer extends Number implements Comparable<Integer>, Constable, ConstantDesc { private final int value; // 真正存储int类型的值 @java.io.Serial @Native private static final l原创 2020-09-25 19:03:06 · 67370 阅读 · 0 评论