![](https://img-blog.csdnimg.cn/143299fe5f2743ae91a9cffef017505e.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JDK源码
文章平均质量分 90
JDK源码
庄小焱
我是庄小焱,某大厂Java高级工程师、PMP项目管理专家、系统架构设计师(高级)、CSDN博文专家。 博主在支付领域,金融领域、订单履约领域不断学习,同时在博客中分享自己学习知识和相关技术, 欢迎大家和我交流学习,欢迎大家关注我的博客。
展开
-
JDK源码——源码学习总结与分析
如何阅读源码,是每个程序员需要面临的一项挑战,为什么需要阅读源码?从实用性的角度来看,主要有三个目的: 解决手头的新问题或者新需求;真正理解一部分理论的落地实现, 应对面试。作为一名java的开发者,需要对JDK源码有一定的了解和学习,同时也是个人能力的体现,也是在面试中给自己的加分项目。因此个人分享JDK源码的学习方法。原创 2021-11-23 22:27:11 · 1850 阅读 · 5 评论 -
JDK源码——linux下jdk8源码编译
摘要平时大家用的JDK都是orcal官网等进行编译好了。但是有同学在公司做开发时候或者是自学习的时候需要对源码进行操作,甚至对JDK做定制化的开发的时候,就需要我们自己进行源码的编译工作。因此本文将详细的介绍JDK8源码进行编译处理。编译工具和环境安装所需的依赖yum install alsa-lib-devel cups-devel libX* gcc gcc-c++ freetype-devel libstdc++-static ant make yum install clang原创 2021-11-23 21:11:12 · 5113 阅读 · 6 评论 -
JDK源码——基本数据类型
博文主要介绍Java的基本数据类型种类和基本数据类型原理,帮助大家在面试中能够更好的应对面试中有关JDK源码的问题。原创 2021-11-22 22:50:15 · 718 阅读 · 0 评论 -
JDK源码——Object源码
这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在JVM中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。这种做法有种弊端,这里我们Person类只有一个Address引用类型,而Address类没有,所以我们只用重写Address类的clone方法,但是如果Address类也存在一个引用类型,那么我们也要重写其clone方法,这样下去,有多少个引用类型,我们就要重写多少次,如果存在很多引用类型,那么代码量显然会很大。如果更改其中的一个基本类型,那么另一个并不会改变。原创 2021-04-29 20:00:53 · 227 阅读 · 0 评论 -
JDK源码——String源码
本博文主要介绍JDK源码中的String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer源码分析。帮助大家更好的学习和了解JDK源码与解答面试问题。原创 2020-08-17 13:56:26 · 701 阅读 · 0 评论 -
JDK源码——Intern()方法
这一句代码,是将 s3中的"11"字符串放入String 常量池中,因为此时常量池中不存在"11"字符串,因此常规做法是跟 jdk6 图中表示的那样,在常量池中生成一个"11"的对象,关键点是 jdk7 中常量池不在Perm区域了,这块做了调整。在 Jdk6 以及以前的版本中,字符串的常量池是放在堆的Perm区的,Perm区是一个类静态的区域,主要存储一些加载类的信息,常量池,方法片段等内容,默认大小只有4m,一旦常量池中大量使用 intern 是会直接产生。下边的s2声明都是直接从常量池中取地址引用的。原创 2021-11-25 13:32:31 · 1135 阅读 · 3 评论 -
JDK源码——Vector源码
同步容器(如Vector)并不是所有操作都线程安全!import java.util.Vector;/** * Copyright (C), 2018-2020 * FileName: Thread_vetcor * Author: xjl * Date: 2020/8/19 12:06 * Description: Vector线程安全 */public class Thread_vetcor { private static Vector<Integ原创 2020-08-19 13:45:01 · 274 阅读 · 0 评论 -
JDK源码——Enum源码
摘要枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。类的对象只有有限个确定的。当需要定义一组常量时,强烈建议使用枚举头星期:Monday(星期一)、......、Sunday(星期天)。性别: Man(男)、Woman(女)。季节:Spring(春节)...... Winter(冬天)。支付方式:Cash(现金)、WeChatPay原创 2022-03-26 10:34:48 · 531 阅读 · 0 评论 -
JDK源码——ArrayList源码
博文介绍有关于ArrayList相关源码,帮助你对ArrayList的底层实现有更加深刻的了解,帮助你的日常的开发中能够使用恰当,写出优秀的代码。原创 2021-11-22 09:36:33 · 156 阅读 · 0 评论 -
JDK源码——CopyOnWriteArrayList源码
CopyOnWriteArrayList,它用到了一种被叫作【写时复制】的技术,使得读操作永远不会加锁,写操作时进行一次自我复制,写入完成后再完成数据的替换。这样只有写写才会冲突等待,读读、读写都不会冲突。原创 2021-04-02 12:54:11 · 122 阅读 · 0 评论 -
JDK源码——LinkedList源码
主要介绍LinkList类相关源码,帮助大家更好的了解底层实现,能够恰当的在项目中使用合适数据类型。原创 2021-11-22 12:43:36 · 488 阅读 · 0 评论 -
JDK源码——HashMap源码
所以可能会造成是的null的值。我们知道,数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式),而在上面我们提到过,在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数组。哈希表:相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。原创 2021-11-22 13:43:57 · 236 阅读 · 0 评论 -
JDK源码——LinkedHashMap类
本博文将详细的介绍LinkedHashMap类。LinkedHashMap继承自 HashMap,其结构可以理解为有序双链表 + 散列表;可以维护两种顺序:插入顺序或访问顺序;可以方便的实现 LRU 缓存;线程不安全。原创 2021-11-24 17:18:11 · 446 阅读 · 0 评论 -
JDK源码——ConcurrentHashMap源码
本博文主要介绍ConcurrentHashMap的基本原理,重点分析ConcurrentHashMap如何保证线程安全以及扩容原理。原创 2023-09-18 18:39:39 · 221 阅读 · 0 评论 -
JDK源码——HashTable源码
值得注意的是,put 方法(包括后面分析的 get 和 remove 等方法)带有 synchronized 关键字,Hashtable 就是通过这种方式实现线程安全的。这里锁定的是整个 table,因此并发效率较低,这也是高并发场景下推荐使用 ConcurrentHashMap 的原因。扩容操作,若 index 位置为链表,且插入顺序为 1、2、3,则在该位置的存储顺序为 3、2、1。Hashtable 是散列表的实现,处理散列冲突使用的是链表法,内部结构可以理解为[数组 + 链表]。原创 2021-11-24 16:53:36 · 169 阅读 · 0 评论 -
JDK源码——TreeMap源码
TreeMap实现了Map 接口,内部节点类型为 Entry;基于红黑树实现,具有红黑树的特点;有序,根据 Entry 的 key 排序;查找、插入、删除操作的时间复杂度均为O(logn)。原创 2021-11-24 21:05:32 · 328 阅读 · 0 评论 -
JDK源码——Volatile源码
JMM决定一个线程对共享变量的写入何时对另一个线程可见,JMM定义了线程和主内存之间的抽象关系:共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存保存了被该线程使用到的主内存的副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。由上面的分析可知,当线程1执行 i =10这句时,会先把i的初始值加载到CPU1的高速缓存中,然后赋值为10,那么在CPU1的高速缓存当中i的值变为10了,却没有立即写入到主存当中。原创 2021-11-26 08:49:25 · 499 阅读 · 1 评论 -
JDK源码——Synchronized源码
在普通实例对象中,oopDesc的定义包含两个成员,分别是 _mark和 _metadata,_mark表示对象标记、属于markOop类型,也就是接下来要讲解的Mark World,它记录了对象和锁有关的信息,_metadata表示类元信息,类元信息存储的是对象指向它的类元数据(Klass)的首地址,其中Klass表示普通指针、 _compressed_klass表示压缩类指针。同时,很多对象锁的锁定状态指会持续很短的时间,因此引入了自旋锁,所谓自旋就是一个无意义的死循环,在循环体内不断的重行竞争锁。原创 2021-11-28 17:46:18 · 384 阅读 · 0 评论 -
JDK源码——Atomic源码(CAS无锁机制)
本博文主要介绍Atomic源码,同时深入的介绍CAS无锁机制在Atomic源码中实现。帮助大家更好的理解Atomic源码使用场景。原创 2021-11-26 09:01:04 · 371 阅读 · 0 评论 -
JDK源码——UnSafe源码
线程中相当于有个许可,许可默认是0,调用park的时候,发现是0会阻塞当前线程,调用unpark之后,许可会被置为1,并会唤醒当前线程。多次调用unpark的效果是一样的,许可还是1。执行cmpxchg指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行CAS操作,也就是说CAS的原子性实际上是CPU实现的, 其实在这一点上还是有排他锁的,只是比起用synchronized, 这里的排他时间要短的多, 所以在多线程情况下性能会比较好。原创 2022-05-14 19:16:02 · 812 阅读 · 0 评论 -
JDK源码——AQS源码
AQS 就是一个抽象类,继承了AbstractOwnableSynchronizer ,主要用来构建锁和同步器。这个类在 java.util.concurrent.locks 包下面,AQS为构建锁和同步器提供了一些通用功能的实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如 ReentrantLock,Semaphore,其他的 ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7) 等等皆是基于 AQS 的。原创 2021-11-24 21:39:38 · 938 阅读 · 0 评论 -
JDK源码——ReentrantLock源码
ReentrantLock是JDK5开始提供的Java实现的显式锁,它是一个可重入锁,依赖于AQS实现。它使用AQS的state变量作为锁的重入次数,每lock()一次state就自增1,每unlock()一次state就自减1,当state减至0时,就代表锁释放了。当锁释放后,AQS会调用unparkSuccessor()去唤醒队列中的后继节点去竞争锁,锁竞争失败的线程AQS会创建一个和线程绑定的Node节点,入队并Park挂起线程。线程同步的细节在AQS类中就已经实现,ReentrantLock原创 2021-11-25 20:57:59 · 286 阅读 · 0 评论 -
JDK源码——ThreadLocal源码
ThreadLocal,简单翻译过来就是本地线程,但是直接这么翻译很难理解ThreadLocal的作用,如果换一种说法,可以称为线程本地存储。简单来说,就是ThreadLocal为共享变量在每个线程中都创建一个副本,每个线程可以访问自己内部的副本变量。这样做的好处是可以保证共享变量在多线程环境下访问的线程安全性。原创 2021-03-31 20:26:24 · 187 阅读 · 0 评论 -
JDK源码——ThreadPoolExecutor源码
本博文将详细介绍ThreadPoolExecutor类相关原理,帮助大家更好的使用线程池在自己的项目中,同时介绍相关原理,帮助大家更好的应对面试中问题。原创 2021-11-27 23:28:59 · 491 阅读 · 0 评论 -
JDK源码——CountDownLatch/CyclicBarrier/Semaphore源码
讲解CountDownLatch,CyclicBarrier和Semaphore这三个并发包里面的辅助类。原创 2021-11-26 21:48:08 · 332 阅读 · 2 评论 -
JDK源码——Callable类
摘要实例代码package com.zhuangxiaoyan.jdk.juc.JucLock;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * @Classname CallableDemo * @Description TODO * @Date 2021/11/27原创 2021-11-27 19:57:52 · 163 阅读 · 2 评论 -
JDK源码——BlockingQueue类
摘要阻塞队列,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示:当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。当阻塞队列是满时,往队列里添加元素的操作将会被阻塞。在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒为什么需要BlockingQueue?好处是我们不需要关心什么时候需要阻寨线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了在concurrent包发布以前,在多线原创 2021-11-26 23:14:50 · 385 阅读 · 0 评论 -
JDK源码——PriorityQueue源码
摘要摘要PriorityQueue其实是一个优先队列,和先进先出(FIFO)的队列的区别在于,优先队列每次出队的元素都是优先级最高的元素。那么怎么确定哪一个元素的优先级最高呢,jdk中使用堆这么一种数据结构,通过堆使得每次出队的元素总是队列里面最小的,而元素的大小比较方法可以由用户Comparator指定,这里就相当于指定优先级。DelayQueue。一、二叉堆基本原理二叉堆的特点是:完全二叉树堆的根节点的优先级最大(即最大或最小)父节点的优先级必定大于子节点,兄弟节点的优先级不确定谁大谁。原创 2020-09-23 18:10:31 · 932 阅读 · 1 评论 -
JDK源码——@Annotation类
摘要提到注解类型,很多同学可能会想到Spring中的注解相关的原理,但是注解是JAVA中常见的概念,与SPring中的注解原理不相同,后期我将详细对Spring中的注解的原理进行详细的说明。本博文将详细的讲述有关于JAVA中的注解类型的相关的原理注解的概念注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。通过定义可以发现:注解是一种元数据形式。即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。注解用来修饰原创 2021-11-23 13:50:31 · 271 阅读 · 0 评论 -
JDK源码——泛型原理
摘要在JDK1.8之后泛型就被引入在JDK源码中,但是很多初学者和初级工程师,甚至中级工程师对这个泛型的了解不够深入,本文将java的泛型的概念和使用做了详尽的介绍。泛型是什么?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建原创 2021-11-23 09:16:11 · 342 阅读 · 0 评论