年9月 2026年9月 17(LTS) 2021年9月 2026年9月 2029年9月 21(LTS) 2023年9月 2028年9月 2031年9月 如果要选择Oracle JDK,目前可选的LTS 各版本介绍 jdk 9 Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具:jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安全增强 特性太多,查看链接: https://openjdk.java.net/projects/jdk9/ jdk 10 https://openjdk.java.net/projects/jdk/10/ C++14 Language Features JDK C++的源码中允许使用C++14的语言特性 357: Migrate from Mercurial to Git OpenJDK源码的版本控制从 JDK13中的文本块 API层面: 比如JDK8中的Stream、Optional、新的日期时间、HashMap的底层结构 比如JDK9中String的底层结构 新的 / 过时的 API 底层优化
以前读过一些 JDK 常用的源码。当时的做法是在 IDE 打开源码文件,同时打开官方文档和谷歌翻译,一边读一边翻译,那时觉得还颇有收获。但是,由于基础薄弱,为了加快速度,有很多不理解的地方跳过了。
语法 先说Java7的try-with-resources(Java9改进版在后文) 避免走入误区 try-with-resources在Java 9中的改进 标识符优化 jdk9之前 JDK9开始 小结 应用场景:比如某个架构师开发了一个工具类MyUtils,该工具类里面使用了jdk9的新特性,这时候该工具在推广的时候会遇到很大的阻力,因为很多用户还没有升级jdk版本,JDK9推出了多版本兼用jar的特性就允许该架构师编写一个同类名的工具 如果jar包是在JDK 9的运行时环境下运行,将使用META-INF/versions/9/下面的class文件进行程序运行。 编译 将Java8 、Java9的IOUtil.java代码分别在JDK8、JDK9的版本下分别编译成class字节码文件,并将class文件按照如下的目录结构打成保存,并打jar包。 代码演示 因为我这里使用的是jdk11,所以讲一下jdk11中对httpClient的改变 变化: 一: 从java9的jdk.incubator.httpclient模块迁移到java.net.http
AbstractMap是Map接口的抽象实现类,通过抽象方法keySet()实现了get(key),remove(key),containsKey(key),containsValue(value)的基本算法,遍历加equals。
重要提示:JDK9版本以上或者JDK9版本,才能使用 简介: Java Shell工具是JDK1.9出现的工具, Java Shell工具(JShell)是一个用于学习Java编程语言和Java代码原型的交互式工具 可以测试单个语句 十分简单的Java程序,省去了创建Java文件的过程 JShell的命令: 1.启动: jshell 我的是JDK11版本的 2.退出: /exit 3.简单使用: jshell
这个区别,就是 await(long timeout, TimeUnit unit) 多了一个超时判断步骤,所在源码如下: public final boolean tryAcquireSharedNanos // 【8】如果过期则取消等待并返回false if (nanosTimeout <= 0L) { //【9】 除非正常或者异常退出 【5】检查前驱结点是否是头结点 【6】如果成功获取锁,则更新头节点并传播状态,返回true 【7】如果未成功获取锁,检查剩余时间是否已过期 【8】如果过期则取消等待并返回false 【9】 取消申请 countDown:倒计时源码 public void countDown() { sync.releaseShared(1); } public return false; } 代码分析: 【1】回调CountDownLatch#Sync的tryReleaseShared方法,返回倒计时是否等于0的判断 【2】如果倒计时到0了,则进行释放倒计时 源码分析
今天从jvm大神"你假笨"的公众号上,看到一个jdk 9+版本的编译bug,记录一下: public class JavacEvalBug{ private static String[] array 一次(这符合预期,因为test()只调用了1次) 但如果把jdk升级到jdk9或10,再次编译运行,evaluated! 原因在于jdk8与jdk9+的编译机制不同,javap -verbose JavacEvalBug 使用这个命令,可以看到编译细节: public static void main(java.lang.String 上,从第10行看,只调用了1次,如果切换到jdk9+,则会变成: public static void main(java.lang.String[]); descriptor: ([Ljava 具体详情分析,大神说是以后会详细分析,大概是字符串拼写的方式,jdk9以后做了变化。
概述 前文「JDK源码分析-PriorityQueue」分析了优先队列 PriorityQueue,它既不是阻塞队列,而且线程不安全。 参考链接: https://juejin.im/post/5cc258796fb9a03228616e6e https://blog.csdn.net/codejas/article/details/89190774 相关阅读: JDK源码分析-PriorityQueue JDK源码分析-ReentrantLock Stay hungry, stay foolish.
>): 判断该集合是否包含另一个集合; 9. addAll(Collection<? 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」分析。
JDK 9 jmods 目录中有97个jmod文件,这些文件都是干嘛的呢?我们在写代码的时候,都应该怎么用呢? /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ tree . . ├── java.activation.jmod ├─ ├── jdk.jartool.jmod ├── jdk.javadoc.jmod ├── jdk.javaws.jmod ├── jdk.jcmd.jmod ├── jdk.jconsole.jmod ├── jdk.jdeps.jmod ├── jdk.jdi.jmod ├── jdk.jdwp.agent.jmod ├── jdk.jfr.jmod ├── jdk.jlink.jmod ├── ├── jdk.naming.dns.jmod ├── jdk.naming.rmi.jmod ├── jdk.net.jmod ├── jdk.pack.jmod ├── jdk.packager.jmod
具体可参考前文对 AQS 共享模式的分析「JDK源码分析-AbstractQueuedSynchronizer(3)」。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.
; } 其中,acquireSharedInterruptibly、tryAcquireSharedNanos 和 releaseShared 都是 AQS 中「共享模式」的方法,具体代码可参考前文「JDK 源码分析-AbstractQueuedSynchronizer(3)」的分析。 Thread-1 add 5 Thread-1 add 6 Thread-1 add 7 Thread-1 add 8 Thread-1 add 9 */ 小结 CountDownLatch 相关阅读: 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。
相关阅读: JDK源码分析-HashMap(1) Stay hungry, stay foolish.
VarHandle,变量句柄,是新的原子访问属性规范,JDK8以前都是通过sun.misc.Unsafe实现原子属性访问。 从JDK9开始,会尽可能使用VarHandle代替Unsafe,实际上VarHandle内部有几个内存屏障相关的方法还是基于Unsafe。 JDK源码真是博大精深啊,简历上写【精通Java】的人脸皮真厚,我也是。 volatile:保证执行顺序,且保证变量不会被重排内存屏障5个方法均为静态方法,看源码,实际上还是调用Unsafe。 arrayVarHandle.compareAndSet(demo.arrayData, 1, 3, 22);System.out.println(demo);}按位更新内存屏障高级volatile参考VarHandle:Java9中保证变量读写可见性
简介 这篇文章主要讲述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 对它的约定。