说实话, 这一块内容也确实比较难, 大家在实践过程中遇到什么问题,欢迎随时和小刀一起讨论,小刀微信: best396975802 下载源码 源码下载地址: https://hg.openjdk.java.net /jdk-updates/jdk11u 直接选左边的zip下载压缩包 安装依赖 因为源码版本不同, 需要的依赖和步骤也不同, 所以强烈建议打开building.html来看一下 基本上是从building.html #boot-jdk-requirements这里开始准备一些基础条件,按上面的命令,把需要的依赖都安装好 必须要准备的: 至少低一个版本的jdk 这里我们的源码是jdk11, 原则上来说, 我们要用10 做bootjdk,但是通过调试日志输出, 我们可以选10和11中的一个 进行Running Configure 这里为了调试, 我们选用了调试信息最多的, slowdebug, 然后添加了boot-jdk =/Users/lixiang/soft/jdk-11.0.2.jdk/Contents/Home --disable-warnings-as-errors 当输出以下内容时, 就是配置成功 make
以前读过一些 JDK 常用的源码。当时的做法是在 IDE 打开源码文件,同时打开官方文档和谷歌翻译,一边读一边翻译,那时觉得还颇有收获。但是,由于基础薄弱,为了加快速度,有很多不理解的地方跳过了。
AbstractMap是Map接口的抽象实现类,通过抽象方法keySet()实现了get(key),remove(key),containsKey(key),containsValue(value)的基本算法,遍历加equals。
1.下载jdk 下载安装 提取码: brq2 2.上传到服务器 3.解压 tar -zvxf openjdk-11+28_linux-x64_bin.tar.gz 4.移动文件夹并重命名 mv jdk -11/ /usr/local/java 5.配置环境变量 vim /etc/profile export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME
现在很多编译器和软件都开始要求使用 JDK 11 了。 因此我们希望在 CentOS 上安装 JDK 11。 运行下面的命令: yum install java-11-openjdk-devel 如果你的系统中还装有不同版本的 JDK 的话。 你需要运行: alternatives --config java 来选择默认的 JDK。 随后你就可以验证安装的 JDK 了。 https://www.ossez.com/t/centos-7-jdk-11/637
现在很多编译器和软件都开始要求使用 JDK 11 了。 因此我们希望在 CentOS 上安装 JDK 11。 运行下面的命令: yum install java-11-openjdk-devel 如果你的系统中还装有不同版本的 JDK 的话。 你需要运行: alternatives --config java 来选择默认的 JDK。 随后你就可以验证安装的 JDK 了。 https://www.ossez.com/t/centos-7-jdk-11/637
这个区别,就是 await(long timeout, TimeUnit unit) 多了一个超时判断步骤,所在源码如下: public final boolean tryAcquireSharedNanos SPIN_FOR_TIMEOUT_THRESHOLD) LockSupport.parkNanos(this, nanosTimeout); // 【11 则更新头节点并传播状态,返回true 【7】如果未成功获取锁,检查剩余时间是否已过期 【8】如果过期则取消等待并返回false 【9】取消申请 【10】如果未过期且满足条件,则挂起当前线程一段时间(1000L纳秒) 【11 取消申请 countDown:倒计时源码 public void countDown() { sync.releaseShared(1); } public return false; } 代码分析: 【1】回调CountDownLatch#Sync的tryReleaseShared方法,返回倒计时是否等于0的判断 【2】如果倒计时到0了,则进行释放倒计时 源码分析
专栏目录 是时候升级java11了-01-jdk11优势和jdk选择 是时候升级java11了-02-升级jdk11踩坑记 是时候升级java11了-03虚拟机Jvm参数设置 是时候升级java11了- 04微服务内http2通信之http2 Clear Text(h2c) 是时候升级java11了-05微服务内h2c通信的阻碍和问题解决 Java8 商用收费 从2019年1月份开始,Oracle JDK 当然如果是个人客户端或者个人开发者可以免费试用 Oracle JDK 所有的版本。 jdk snmp 模块。 javafx,openjdk 是从java10版本就移除了,oracle java10还尚未移除javafx ,而java11版本将javafx也移除了。 可以在容器中使用内存和CPU约束来直接管理Java应用程序,其中包括: 遵守容器中设置的内存限制 在容器中设置可用的CPU 在容器中设置CPU约束 JDK推荐 由于 Java 11 开始,Oracle
概述 前文「JDK源码分析-PriorityQueue」分析了优先队列 PriorityQueue,它既不是阻塞队列,而且线程不安全。 代码分析 主要成员变量 // 内部数组的默认初始化容量 private static final int DEFAULT_INITIAL_CAPACITY = 11; // 内部数组的最大容量 private juejin.im/post/5cc258796fb9a03228616e6e https://blog.csdn.net/codejas/article/details/89190774 相关阅读: JDK 源码分析-PriorityQueue JDK源码分析-ReentrantLock Stay hungry, stay foolish.
>): 从该集合中移除指定集合的所有元素; 11. removeIf(Predicate<? super E>): 从该集合中移除满足指定条件的元素,其中 Predicate 是 JDK 1.8 引入的函数式操作,即传入的参数是一个方法; 12. retainAll(Collection<? 16. spliterator(): 可分割迭代器,用于并行遍历集合中的元素(iterator() 方法是顺序遍历); 17. stream() & parallelStream(): JDK 1.8 super T>) 方法,该方法也是 JDK 1.8 引入的,提供遍历集合元素的函数式操作。 PS: JDK 版本如下: ? 阅读源码时,个人以为应该先读接口类,而非具体的实现类。原因有二: 1. 实现类的代码一般较多,如果初读源码就钻到实现类,可能容易被搞蒙。 Stay hungry, stay foolish
概述 ThreadPoolExecutor 是 JDK 中线程池的实现类,它的继承结构如下: ? maximumPoolSize: 最大池大小,线程池中能同时存在的最大线程数,大于等于 corePoolSize; workQueue: 工作/任务队列,是一个阻塞队列,可参考前文「JDK 源码分析-BlockingQueue」的分析。 runWorker(this); } // 其他一些 AQS 相关的方法不再一一列举} 可以看到 Worker 类继承自 AQS,它的实现与 ReentrantLock 有一些类似,可对比前文「JDK 源码分析-ReentrantLock」分析。
具体可参考前文对 AQS 共享模式的分析「JDK源码分析-AbstractQueuedSynchronizer(3)」。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.
; } 其中,acquireSharedInterruptibly、tryAcquireSharedNanos 和 releaseShared 都是 AQS 中「共享模式」的方法,具体代码可参考前文「JDK 源码分析-AbstractQueuedSynchronizer(3)」的分析。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.
结点类 Node 查看 LinkedList 的源码可发现它内部有个嵌套类 Node,代码如下: private static class Node<E> { E item; // 存储的数据 相关阅读: JDK源码-Queue, Deque Stay hungry, stay foolish.
CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。
概述 前文「JDK源码分析-HashMap(1)」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap。
数组能够分配的最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 构造器 // 构造一个空的 Hashtable,初始容量为 11 ,负载因子为 0.75 public Hashtable() { this(11, 0.75f); } // 构造一个空的 Hashtable,指定初始容量,负载因子为 0.75 public extends V> t) { this(Math.max(2*t.size(), 11), 0.75f); putAll(t); } 主要方法分析 put 方法 public synchronized 默认初始化容量为 11,默认负载因子为 0.75; 3. 线程安全,使用 synchronized 关键字,并发效率低; 4. 相关阅读: JDK源码分析-HashMap(1) Stay hungry, stay foolish.
简介 这篇文章主要讲述jdk本身的源码该如何阅读,关于各种框架的源码阅读我们后面再一起探讨。 笔者认为阅读源码主要包括下面几个步骤。 设定目标 凡事皆有目的,阅读源码也是一样。 从小的方面来说,阅读某一段源码的目的就是要搞清楚它的原理,就是死磕,就是那种探索真相的固执。 目的是抽象的,目标是具体的,我们阅读源码之前一定要给自己设定一个目标。 比如,笔者学习ConcurrentHashMap这个类时,上网一查很多都是基于jdk7的,那这时候就可以提出一个问题,jdk8与jdk7中ConcurrentHashMap这个类的实现方式有何不同? jdk8对jdk7作了哪些优化? (3)不断发现问题 在源码阅读的过程中,可能看着看着就遇到个问题,这是非常常见的,这种问题也应该保留下来研究研究。 jdk源码还是比较好阅读的,如果后面看spring的源码,做不到忽略不必要的细节,真的是会迷失的,先埋个伏笔哈~~ 举个例子,之前阅读过ArrayList的序列化相关的代码中的readObject()方法
说明 对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。 所以我的JDK源码分析,着重在JDK的体系架构层面,具体源码可以参考:http://www.cnblogs.com/skywang12345/category/455711.html。 (jdk.java:383) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ... Frank Yellin * @see java.lang.Error * @jls 11.2 Compile-Time Checking of Exceptions * @since JDK1.0 */ public class Exception extends Throwable { Error 源码分析 Error 最重要的意义,在于 JVM 对它的约定。
DelayQueue 也是一种队列,它内部的元素有“延迟”,也就是当从队列中获取元素时,如果它的延迟时间未到,则无法取出。