为什么大部分程序员还在用Java 8?

简介: 不说 Android,Java 本身都很碎片化。尽管 Java 升级换代,但于开发者来说,还是紧紧地抱着 Java 8 不放,这是为什么呢?一起来看下吧

不说 Android,Java 本身都很碎片化。尽管 Java 升级换代,但于开发者来说,还是紧紧地抱着 Java 8 不放,这是为什么呢?一起来看下吧。


以下为译文:


近日的调查结果显示,绝大多数开发人员的主要应用程序中使用的还是 Java 8。

image.png



数据来源:https://snyk.io/blog/jvm-ecosystem-report-2018/


在Java 8之前,用户接受更高版本的Java的过程非常缓慢,特别是在企业中,因为在生产环境中接受新版本Java非常困难。


而引入了Lambda表达式和流的Java 8对许多开发人员来说都非常有吸引力。同时,微服务、持续发布实践和更好的自动化测试也让接受新版本语言变得更容易,风险比以前更小。


那么,鉴于这些因素,为什么从Java 9开始每年两次发布新版本的情况下,开发人员还在坚持使用Java 8呢?目前Java最新的版本是Java 12,然而很少有人使用9~12的版本。推荐:Java 12 正式发布,8大新特性!


估计你能猜到这其中的原因:“很复杂”。Java 8之后的版本发生了很多变化,这可能会导致各个公司在Java升级上举棋不定。


6 个月一次的发布节奏


从2017年9月发布Java 9开始,Oracle每六个月就会发布一个新版本的JDK,具体来说是每年的三月和九月。现在持续发布大行其道,所以一门语言一改以往三年发布一次的做法,转而采用更快的发布速度,这也完全合情合理。


在新的发布节奏下,不会再出现每几年发布一大堆功能的情况(伴随着风险极高的大型升级),而是在预定的日期内推出更小的发布。当然,这些发布包含的功能会少很多,但这种方式有几个好处:


方便计划。预定的发布节奏不仅方便了语言开发者,也方便使用者制定升级计划。


更高的质量。更频繁的发布意味着如果某次发布中某个功能没有做好,就会被推迟到下一次发布。因此,语言开发者的压力更小,不需要赶工完成功能,因此每次发布的质量更高。


稳定的新功能来源。以前是每三年一次巨大的更新,而现在可以持续地获得更新,包括语言特性、垃圾收集器的变化和性能改善。


如此快的发布节奏也可能造成的负面影响,例如许多组织根本跟不上六个月一次的升级节奏。这一点也在考虑中,因为Oracle也会受到这个影响。


长期支持版


Oracle不愿意像以前每三年发布一个版本时那样支持每个旧版本,这样做的成本太高。


image.png


如果Oracle每六个月发布的版本都要支持三年,那么在2020年前后他们就要支持六个不同的版本!


相反,他们说每三年会有一个“长期支持的版本”(Long Term Support release,简称LTS),该版本会提供为期三年的支持。Java 8是一个LTS,当前的LTS是Java 11,下一个应该是Java 17。


image.png


Oracle每三年选择一个版本提供长期支持和更新,其他版本仅支持六个月。


但是,两个LTS之间的版本在下一个版本发布时就会失去支持。这就是说,Java 10会替代Java 9,而Java 11发布时又会替代Java 10。推荐:Java 10 最重要的 5 个新特性!

image.png



开发人员在升级Java 8时一般会直接升级到Java 11。


这就是如今出现这种局面的原因,一般来说,人们不会使用Java 9或10。就算他们用过,应该也都升级到了Java 11。推荐阅读:Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码。


短期版本应该在新版本发布后立即升级,长期版本会支持至少三年,因此现在有两种主要的升级途径:


每六个月新版本一出来就升级。这意味着每六个月就要使用最新版本。这样做的好处是能够立即获得新的语言特性,但这种方式通常只适合那些习惯于迅速升级技术栈的人们。


只升级长期支持版本。对于Java开发人员来说这种节奏更为熟悉。这种升级有三年一次大型升级的缺点,但人们有更多时间来评价这种升级带来的风险。


也许还有一个折中的办法:在生产环境中使用LTS版本,同时在CI中确保应用程序能在每六个月一次的新版本上运行。这样既能将大型升级的风险降到最低,同时还能维护生产环境要求的稳定性。


授权变化


长期支持版本有个问题。Oracle的立场是,如果你需要长达三年的支持和更新,就应当考虑为其付费。所以,如果你想使用LTS版本并要求三年的支持,就要为Oracle的商业版JDK付费。


但是,Oracle也认识到并不是每个人都愿意付费,而且许多人更喜欢用开源的方式工作,所以他们现在有两个版本的JDK,其特性完全一样,但授权不同。


商业版JDK可以在开发和测试中免费使用,但在生产环境中使用则需要付费;还有一个完全免费的OpenJDK版本。后者采用了开源的GPLv2+CPE授权,但其生命周期只有六个月。


从竞争的观点来看,这其实是好事。Oracle始终会将JDK中的功能移植到OpenJDK中,甚至还包括那些曾经用于商业版的功能,如Java Flight Recorder和Java Mission Control等。


所以,由OpenJDK产生的一切JDK(也是绝大部分人都在使用的JDK)会包含你曾经用过的一切特性,甚至还会包括一些你没用过的特性。


还有许多其他供应商提供JDK。大部分是免费的,部分JDK的支持时间和期限与Oracke JDK不一样。这篇文档(https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/preview#heading=h.xn49s5cqkp4j)列出了不同的选项,并按照可以免费使用、必须拥有商业授权才能使用的方式分类。


如果这些信息难以消化,那么最好的方法就是下载AdoptOpenJDK(https://adoptopenjdk.net/)构建的OpenJDK。这个JDK与Oracle JDK完全兼容,而且主要的操作系统和平台上都有,你可以选择不同的JVM(Hotspot或OpenJ9),他们还承诺为LTS版本提供至少四年的支持,而且还可以购买商业支持。


由于这个话题可能会非常复杂,我强烈建议阅读Java Champion的这篇文章《Java Is Still Free》(https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/preview),文中提供了更详细的信息。


总结


从Java 8发布之后许多情况都发生了改变:六个月一次的更新;授权、更新和支持的变化,以及JDK的获取途径等。在此之上还有语言变化,包括那些Java 9中引入的主要变化。


虽然这些变化让人头晕目眩,但其目的是为了给世界上最流行的语言提供高质量、频繁且在计划内的更新,同时让负责该语言的人能够持续做下去。


我们需要理解,这些改变可能会影响你的应用程序和组织,通过学习如何接受这些变化,最终会让你接受Java 8以及其后每六个月一次的新版本中引入的改进。


关注Java技术栈微信公众号,在后台回复关键字:Java,可以获取一份栈长整理的 Java 8-12 新特性干货。


作者 | Trisha Gee 原文:https://dzone.com/articles/beyond-java-8 译者 | 弯月 责编 | 屠敏 出品 | CSDN(ID:CSDNnews)


相关文章
|
7月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
717 33
|
7月前
|
网络协议 Java 大数据
【高薪程序员必看】万字长文拆解Java并发编程!(1)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
128 0
|
7月前
|
安全 Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-1)
🔥【高薪程序员必看】万字长文拆解Java并发编程!面试官看了直呼内行,90%人不知道的线程安全骚操作!💻🚀《16个高频面试灵魂拷问+底层源码暴击》🔥👉戳这里看如何用1个月经验吊打3年程序员!📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!
130 0
|
7月前
|
Java 程序员 应用服务中间件
【高薪程序员必看】万字长文拆解Java并发编程!(2 2-2)
📌 核心痛点暴击:1️⃣ 面了8家都被问synchronized锁升级?一张图看懂偏向锁→重量级锁全过程!2️⃣ 线程池参数不会配?高并发场景下这些参数调优救了项目组命!3️⃣ volatile双重检测单例模式到底安不安全?99%人踩过的内存可见性大坑!💡 独家亮点抢先看:✅ 图解JVM内存模型(JMM)三大特性,看完再也不怕指令重排序✅ 手撕ReentrantLock源码,AQS队列同步器实现原理大揭秘✅ 全网最细线程状态转换图(附6种状态转换触发条件表)
135 0
|
7月前
|
缓存 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(3-1):并发共享问题的解决与分析
活锁:多个线程相互影响对方退出同步代码块的条件而导致线程一直运行的情况。例如,线程1的退出条件是count=5,而线程2和线程3在其代码块中不断地是count进行自增自减的操作,导致线程1永远运行。内存一致性问题:由于JIT即时编译器对缓存的优化和指令重排等造成的内存可见性和有序性问题,可以通过synchronized,volatile,并发集合类等机制来解决。这里的线程安全是指,多个线程调用它们同一个实例的方法时,是线程安全的,但仅仅能保证当前调用的方法是线程安全的,不同方法之间是线程不安全的。
141 0
|
7月前
|
Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(3-2):并发共享问题的解决与分析
wait方法和notify方法都是Object类的方法:让当前获取锁的线程进入waiting状态,并进入waitlist队列:让当前获取锁的线程进入waiting状态,并进入waitlist队列,等待n秒后自动唤醒:在waitlist队列中挑一个线程唤醒:唤醒所有在waitlist队列中的线程它们都是之间协作的手段,只有拥有对象锁的线程才能调用这些方法,否则会出现IllegalMonitorStateException异常park方法和unpark方法是LockSupport类中的方法。
156 0
|
7月前
|
存储 安全 Java
【高薪程序员必看】万字长文拆解Java并发编程!(4-1):悲观锁底层原理与性能优化实战
目录4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
137 0
|
7月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
251 0
|
7月前
|
安全 Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(6-2):从CAS无锁机制到Atomic原子类实战指南
🌟 ​🌟今天给大家带来的是 ​💻⚡在这篇文章中,我们将一起探索:🔹 ​的底层原理,它是如何通过 ​实现无锁并发的?🔹 ​的终极对决,为什么高并发场景下CAS性能更优?🔹 ​的陷阱与解决方案——和实战演示!🔹 ​​(LongAdder等)的使用场景与性能对比🔹 危险的 ​黑魔法:为什么阿里禁止使用却又是并发库的基石?无论你是:✅ ​​(BATJ高频考点)✅ ​​(如何设计百万级计数器)✅ ​​(从Java代码到CPU指令的全链路分析)这篇文章都会让你收获满满!✨。
115 0
|
7月前
|
安全 Java 程序员
【高薪程序员必看】万字长文拆解Java并发编程!(6-1):从CAS无锁机制到Atomic原子类实战指南
🌟 ​🌟今天给大家带来的是 ​💻⚡在这篇文章中,我们将一起探索:🔹 ​的底层原理,它是如何通过 ​实现无锁并发的?🔹 ​的终极对决,为什么高并发场景下CAS性能更优?🔹 ​的陷阱与解决方案——和实战演示!🔹 ​​(LongAdder等)的使用场景与性能对比🔹 危险的 ​黑魔法:为什么阿里禁止使用却又是并发库的基石?无论你是:✅ ​​(BATJ高频考点)✅ ​​(如何设计百万级计数器)✅ ​​(从Java代码到CPU指令的全链路分析)这篇文章都会让你收获满满!✨。
110 0