写点什么

2022 年都快结束了,Java 的这些新技术、热门技术,你不会还不知道吧?

作者:wljslmz
  • 2022-10-22
    江苏
  • 本文字数:5680 字

    阅读完需:约 19 分钟

2022年都快结束了,Java的这些新技术、热门技术,你不会还不知道吧?

Java 是 Sun Microsystems 于 1995 年发布的一种跨平台的面向对象的编程语言,因为其快速、可靠、通用、安全且易于学习,所以成为目前最流行和广泛使用的编程语言之一。


从 1995 年到 2022 年,JDK 从 1.0 已经更新到 19,27 年来,Java 的每次更新可谓是惊艳无比,给开发者带来极大的方便,同时与时俱进。那么 2022 年了,Java 有哪些最新最热门的技术?

一、JDK19 最新更新

谈到 Java 最新技术,那么一定会谈到 JAVA 19,这一小节,我们先来看下 JAVA 19 有哪些更新。



从 openJDK 看出,JAVA 19 主要有以上截图中的特性,我们来一一了解一下。

1.1 记录模式 (预览)

如果不经常关注 JDK 更新的朋友肯定对记录模式很陌生,甚至都没听过,其实记录模式非常好用。官方的解释是这样的:“记录模式由一个类型、一个可能为空的记录组件模式列表(用于匹配相应的记录组件)和一个可选标识符组成,带有标识符的记录模式称为命名记录模式,变量称为记录模式变量。”


对于新手来说,不加以白话文的解释是看不懂的。我们直接上代码,用代码给大家作解释:


record Test(int a, int b) {}
复制代码


形如以上代码的就是记录模式。


record 是一种新类型,本质上是一个 final 类,在修改所有属性的同时加 final,会自动编译public get hashcodeequalstoString方法,这样减少了代码量。record 在 Java 14 中被提出,在 Java 15 中进入预览阶段,并在 Java 16 中发布。


我们编写一个 Drone 类,定义 sn、brand、name:


package com.wljslmz;
public record Drone(String sn, String brand, String name) {}
复制代码


record 的使用:


package com.wljslmz;
public class RecordTest {
public static void main(String[] args) { Drone drone1 = new Drone("0a9f55785ebc4c52", "DJI", "M30无人机"); Drone drone2 = new Drone("7400f6c1c5644c6e", "DJI", "精灵4无人机"); System.out.println(drone1); System.out.println(drone2); }}
复制代码


输出结果:


Drone[sn=0a9f55785ebc4c52, brand=DJI, name=M30无人机]Drone[sn=field 7400f6c1c5644c6e, brand=DJI, name=精灵4无人机]
复制代码


在 Java 19 中,模式匹配被引入 record 中,这样的话就可以使用instanceof


package com.wljslmz;
public class RecordTest {
public static void main(String[] args) { Drone drone1 = new Drone("0a9f55785ebc4c52", "DJI", "M30无人机"); if(drone1 instanceof Drone droneType){ System.out.println(drone1.sn()); } Drone drone2 = new Drone("7400f6c1c5644c6e", "DJI", "精灵4无人机"); if(drone2 instanceof Drone(String sn, String brand, String name)){ System.out.println("无人机2的序列号为:"+sn+",厂商为:"+brand+",名称为:"+name); } }}
复制代码


输出结果:


0a9f55785ebc4c52
无人机2的序列号为:7400f6c1c5644c6e,厂商为:DJI,名称为:精灵4无人机
复制代码

1.2 虚拟线程(预览)

在讲虚拟线程前,给大家稍微普及一下线程的知识。


研究过 Java 虚拟机的朋友都知道,线程一直是 Java 并发编程中非常重要的一部分。Thread 是 Java 中的并发单元,每个 Thread 线程都提供了一个栈来存储局部变量和方法调用,以及关于线程上下文的信息。Java 线程和系统内核线程是一一对应的,Java 线程是由系统内核线程调度的,所以到并发场景中,我们第一个想到的是增加线程数目去提高系统的性能。



多线程模型能不能解决并发中绝大多数问题?


答案肯定是:能!但是可取吗?


小型的并发场景可取,但是并发数很大的场景就不可取了。线程的数目当然是越多,越能提高系统的性能,但是这个带来的直接后果就是成本增加,上面我们说过了,Java 的线程是由系统内核直接调用的,那么也就意味着,多线程需要在物理上增加机器,试想一下,这种成本代价得多高?


那有人肯定说了,不是还有线程池吗?


不错,线程池确实能提高并发场景下系统的性能,但是,请注意,线程池只是帮助你如何更好的管理线程、利用线程,本身不会凭空给你创造出线程来,最终工作的还是底层的内核线程。而且线程池往往会受限于 CPU、网络、内存等,所以从硬件的角度来看,并没有解决实际问题。


因此,Java19 引入了虚拟线程。


我们来看下虚拟线程的模型是什么样的:



多线程模型中的线程在虚拟线程模型中被称为平台线程,一个平台线程对应多个虚拟线程,最终其实也是由内核线程去驱动。


在体验上虚拟线程与 Threads 没有区别,并且兼容之前的 API,但相比而言它们占用的资源非常少,并且优化了硬件使用效率。


package com.wljslmz.demo;
import Java.util.concurrent.ExecutorService;import Java.util.stream.IntStream;
import static Java.util.concurrent.Executors.*;
/** * @author: wangrui * @date: 2022/10/18 15:12 * @description: 虚拟线程测试 */public class VirtualThreadTest {
public static void main(String[] args) { long start = System.currentTimeMillis(); try (ExecutorService executor = newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 1000000).forEach(index -> { executor.submit(() -> { Thread.sleep(1000); return index; }); }); System.out.println("执行消耗时间:" + (System.currentTimeMillis() - start) + "毫秒"); } }}
复制代码


执行结果:


执行消耗时间:8550毫秒
复制代码


代码中我们创建了 100 万个线程,每个线程睡眠 1 秒钟,完成这个操作最终只花了 8 秒多,假如我们使用的是普通线程去处理或者线程池去处理,那么这个速度能差异到多少呢?


我们稍微改动一下代码:


long start = System.currentTimeMillis();
ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 1000000; i++) { executor.submit(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); } System.out.println("执行消耗时间:" + (System.currentTimeMillis() - start) + "毫秒");
复制代码


最后执行的时间:


执行消耗时间:13459毫秒
复制代码


差距是不是也不是很大,确实是的,因为虚拟线程只会增加程序的吞吐量,不会增加程序的处理速度

1.3 Vector API

Vector API 最初在 Java 16 中被引入,Java 19 带来了它的第四次迭代。简单来说 Vector API 可以加速矢量计算,在数学计算领域非常有用。


在传统计算中,数据的处理都是一个一个处理的,这种操作被称为“SISD”,即“单指令,单数据”:



但是在 Vector API 中,数据的计算可以做到“单指令,多数据”,即“SIMD”:



这个代表什么意思呢?


比如我们对两组数据进行处理,普通处理的方式就是,遍历这些数组,然后逐个处理:


int[] array1 = {1, 2, 3, 4, 5};int[] array2 = {6, 7, 8, 9, 10};int[] array3 = new int[5];for (int i = 0; i < 5; i++) {    array3[i] = array1[i] + array2[i];}
System.out.println(Arrays.toString(array3));
复制代码


如上代码,我们定义了两个数组,现在我们想对相同下标的数进行相加,所以我们遍历了数组,一对一对进行处理,最终的结果就是:


[7, 9, 11, 13, 15]
复制代码


如果使用 Vector API 应该怎么写?


int[] array1 = {1, 2, 3, 4, 5};int[] array2 = {6, 7, 8, 9, 10};int[] array3 = new int[5];
VectorSpecies<Integer> intvector = IntVector.SPECIES_PREFERRED;int[] intvectorBound = intvector.loopBound(5);
int i = 0;for (; i < intvectorBound; i += intvector.length()) { var array1Intvector = IntVector.fromArray(intvector, array1, i); var array2Intvector = IntVector.fromArray(intvector, array2, i); var array3Intvector = array1Intvector.add(array2Intvector); array3Intvector.intoArray(array3, i);}
for (; i < 5; i++) { array3[i] = array1[i] + array2[i];}
System.out.println(Arrays.toString(array3));
复制代码


这个代码看起来是比非 Vector API 复杂了,但是处理的思想完全不一样,普通处理方法是单个数据单个数据进行处理,而 Vector API 是多组数据处理,两者如果在大数据量计算的时候,其性能就可想而知了。

1.4 switch 模式匹配

模式匹配在 Java 19 中得到了相当大的更新,改进后的 Switch 模式匹配代码更简洁,逻辑更清晰。


在 Java 19 中,使用 when 子句增强保护,在 Java 17 和 Java 18 中,Switch 是这样使用的:


switch (t) {  case student s && s.age() > 18 -> System.out.println("学生成年");  case student s ->  System.out.println("学生未成年");  default -> System.out.println("数据有误");}
复制代码


那么在 Java19 中就是这样的:


switch (t) {  case student s when  s.age() > 18 -> System.out.println("学生成年");  case student s ->  System.out.println("学生未成年");  default -> System.out.println("数据有误");}
复制代码


这种保护模式可比if else条件判断好用多了。

1.5 外部函数和内存 API(预览)

访问堆外内存有几种方式:


  • 使用 ByteBuffer;

  • 使用 Unsafe;

  • 使用 JNI。


每种方式都有其优缺点,使用带 ByteBuffer 的直接缓冲区时,限制为 2GB,这是 int 可以处理的范围,内存释放取决于 GC。Unsafe 性能不错,但并不安全,访问释放的内存会导致 JVM 崩溃。使用 JNI 需要编写 C 代码,性能不好。


Java 19 为 Java 程序引入一系列的 API,以便与 Java 运行时之外的代码和数据进行交互。API 高效地执行外部函数(即 JVM 之外的代码)并安全地访问外部内存(不受 JVM 管理的内存),允许 Java 程序调用本地库和管理本地数据,从而使得程序拥有易用性高性能通用性安全性等特点。

1.6 结构化并发

JDK 19 引入了结构化并发,目前处于孵化阶段。


当我们在 Java 中创建一个新线程时,操作系统会进行系统调用,告诉它创建一个新的系统线程。我们都知道,创建系统线程的成本很高,因为调用会占用大量时间,并且每个线程都会占用一些内存,线程也共享相同的 CPU,我们是不希望出现阻塞的情况。


这个时候可能就会想到使用异步编程来防止阻塞情况的发生,启动一个线程并告诉它在数据到达时要做什么。在数据可用之前,其他线程可以将 CPU 资源用于其任务。异步编程确实实现了其想要的效果,但是往往处理起来比较麻烦,那么结构化并发就可以简化并发编程中的种种麻烦事,使得编写和调试多线程代码变得更加容易。


结构化并发的原理就是使线程的生命周期与结构化编程中的代码块相同。如果在方法 1 中调用方法 2 ,则必须先完成方法 2,然后才能退出方法 1,方法 2 的生命周期不能超过方法 1 的生命周期。


我们来画个图进行解释一下,看完你就懂了。



如图,线程 1 启动了一个线程,我们暂且叫它线程 2,两者彼此分开工作,但在线程 1 完成之前,它必须等待线程 2 完成其工作。

1.7 Linux/RISC-V 移植

这个我们简单了解一下,其思想就是将 JDK 移植到开源 Linux RISC-V 架构。RISC-V 标准是 12 年前由加州大学伯克利分校教授 David Patterson 和 Krste Asanović发明的,开发人员可以自由更改 RISC-V 芯片的指令集架构与英特尔 x86、Arm 处理器的指令集架构。


估计这个解释,各位看官不认可或者直接不知所云,说的简单点,就是通过 Linux/RISC-V 移植,Java 可以支持对硬件发送指令,这个就很厉害了,以前提到硬件,那么必然想到的语言就是 C 或者 C++,但是目前 Linux/RISC-V 移植还不完善,我们期待有一天在硬件开发的领域中,Java 能够有自己的一席之地!

二、热门技术

在第一章节,我们介绍了目前 Java 最新版本 Java19 中最新的功能,本章节,我们介绍一下 2022 年比较热门的 Java 技术。

2.1 微服务

微服务的火热其实已经持续很长时间了,传统服务一般是单体服务,但是随着业务的增加、架构的复杂,单体服务会使得本身服务变得非常臃肿,性能也会非常低。



那么把服务拆分,不仅可以做到解耦合,还能在很大程度上提高系统的性能。



微服务的特点:


  • 自治:微服务是自包含的,可以独立开发和部署,而不会影响其他服务。

  • 专业化:每个微服务都针对一种特定功能而设计。

  • 无状态:微服务不共享服务的状态,在某些情况下,如果需要维护状态,可以在数据库中进行维护。


在微服务中,Java 相关的技术主要是 Spring Boot + Spring Cloud,这也是 Java 开发微服务的最佳选择,因为两者的体系非常成熟,而且社区活跃度也非常高。Spring Cloud 提供了许多开箱即用的特性,比如服务发现和负载均衡。

2.2 并发

并发编程一直是非常火热的技术,不仅仅在企业开发中出场率高,在面试中也是占据主要席位的,还有人说并发是区分普通开发人员和优秀程序员的标准,可见并发编程的重要性和难度。


在并发中,常见的技术主要有 Thread、Runnable 对象锁、同步、死锁、活锁、CyclicBarrier、CountDownLatch、Phaser 和 CompleteableFuture 等。

2.3 NoSQL

数据库是 Java 开发中最基本的技术,就跟人的手脚一样,但是 NoSQL 不一样,它就像我们出行方式中的高铁、飞机一样,虽然说去某个地方也能走路过去,但是坐高铁、坐飞机,速度提升的不是一般的快。所以说 NoSQL 的应用是非常重要的,也是比较热门的技术。


出场率比较高的两个 NoSQL 有:


  • Redis:即 REmote Dictionary Server,由 Salvatore Sanfilippo 创立。它最初于 2009 年 4 月 10 日发布,是一种内存数据库,可用作数据库、缓存和消息代理。

  • MongoDB:MongoDB 由 DoubleClick、ShopWiki 和 Gilt Groupe 于 2007 年创立,是一个面向文档的数据库,使用动态模式来存储类似 JSON 的文档。

三、总结

2022 年即将结束,不知道你这一年写了多少行代码,写代码的同时是否想过今年比较热门的技术有哪些?比较新的技术又有哪些?本文,笔者给大家着重介绍了 Java 最新版本 Java19 的新特性以及比较热门的微服务、并发、NoSQL。在今年 11 月中旬,还会有 SpringBoot3 和 Spring6 的发布,到时候大家别忘了去看看有哪些新特性哦,希望本文可以让您快速的了解 2022 年最新最热门的 Java 技术,有任何问题欢迎在下方评论区与我讨论。

发布于: 刚刚阅读数: 5
用户头像

wljslmz

关注

极致主义者,追求技术的路上,勇往直前! 2021-05-24 加入

公众号:网络技术联盟站 👍InfoQ签约作者 👍阿里云社区签约作者 👍华为云 云享专家 👍BOSS直聘 创作王者 👍腾讯课堂创作领航员 博客+论坛:https://www.wljslmz.cn 工程师导航:https://www.wljslmz.com

评论

发布
暂无评论
2022年都快结束了,Java的这些新技术、热门技术,你不会还不知道吧?_Java_wljslmz_InfoQ写作社区