Java 19 正式发布,改善多线程、并发编程难度

2023-05-16

fffc410f4fcbba67bedf689210c96e36.png

Java 19 在数分钟前正式发布,这是一个非 LTS(长期支持)版本。该版本的七项功能包括结构化并发、记录模式、外部函数和内存 API 的预览,以及对开源 Linux/RISC-V 指令集架构 (ISA) 的支持。

新特性

  • JEP 405 Record Patterns (预览)

  • JEP 422 Linux/RISC-V Port

  • JEP 424 Foreign Function & Memory API (预览)

  • JEP 425 Virtual Threads (预览)

  • JEP 426 Vector API (第四次孵化)

  • JEP 427 Pattern Matching for switch (第三次预览)

  • JEP 428 Structured Concurrency (孵化)

JEP 405 Record Patterns

这是对Java 17正式生效的Record Class的增强。JEP 405让记录模式和类型模式可以嵌套,以实现强大的、可声明的、可组合的数据处理形式。

在JDK 16 中,我们已经可以实现下列特性:

// jdk 16 以前
if (o instanceof String) {
    // 及时类型匹配 依然需要转换
    String s = (String)o;     
}

// jdk 16 以后
if (o instanceof String s) {
    // 直接使用 s 
}

但是上面的特性应用在Record Class中并不是很丝滑,依然需要通过属性方法来获取属性值:

public record Position(int x, int y) {}

// record 结合类型匹配 依然需要通过方法获取属性
private void print(Object object) {
  if (object instanceof Position position) {
    int x =  position.x();
    int y =  position.y();
  } 
}

JEP 405中我们可以这样:

private void print(Object object) {
  if (object instanceof Position(int x, int y)) {
      // 直接使用 x 和 y
  } 
}

当然这仅仅是 JEP 405 的一小部分,该特性也可以应用到switch语句,甚至是嵌套条件中。

JEP 422 Linux/RISC-V Port

由于 RISC-V 指令集架构的硬件越来越多,从Java 19开始提供相应架构的端口。

RISC-V是一个免费和开源的 RISC 指令集架构 (ISA),最初由加州大学伯克利分校设计,现在在RISC-V International的赞助下合作开发。它已经被广泛的语言工具链支持。随着 RISC-V 硬件的日益普及,JDK 的移植将是有价值的。

JEP 424 Foreign Function & Memory API

通过该特性,Java 程序可以通过 API 与 Java 运行时之外的代码和数据进行互操作。通过有效地调用外部函数(即JVM之外的代码)和安全地访问外部内存(即不受 JVM 管理的内存),API 使 Java 程序能够调用 native 库并处理 native 数据,比使用JNI更加安全。这个JEP并不是第一次预览,从JDK 14开始陆续相关的特性都经过孵化和预览,本次是对以往的相关预览特性的改进。

JEP 425 Virtual Threads

虚拟线程,关于虚拟线程之前胖哥有文章进行来专门讲解科普,有兴趣可以通过这篇文章进行了解。

91716de70d644ae36e5455930c4fad60.png

      传统线程和虚拟线程

在本次 Java 19 中虚拟线程正式以预览的状态亮相,这能够简化对多线程的操作,让以往“昂贵”的线程更加“廉价”。

JEP 426 Vector API

引入一个 API 来表达向量计算,该计算可以在运行时可靠地编译为支持的 CPU 架构上的最佳向量指令,从而实现优于等效标量计算的性能。这个特性已经算老面孔了,已经是第四次预览了。

JEP 427 Pattern Matching for switch

switch语句的匹配模式,目前还没有转正,这是它第三次预览。胖哥已经多次介绍该特性,可以去胖哥往期JDK发布的文章看看。

JEP 428 Structured Concurrency

结构化并发,听起来很厉害的样子。通过引入用于结构化并发的 API 来简化多线程编程。结构化并发将在不同线程中运行的多个任务视为单个工作单元,从而简化错误处理和取消,提高可靠性并增强可观察性。这是一个孵化 API 。

结构化并发 API 的主体类是StructuredTaskScope。此类允许开发人员将任务构建为一系列并发子任务,并将它们作为一个单元进行协调。子任务在它们自己的线程中执行,方法是将它们单独分叉(fork),然后将它们作为一个单元加入,并可能将它们作为一个单元取消( cancel )。子任务的成功结果或异常由父任务聚合和处理。StructuredTaskScope将子任务或分叉的生命周期限制在明确的词法范围内,这样我们可以像写单线程代码一样来写多线程代码。官方给来一个例子:

Response handle() throws ExecutionException, InterruptedException {
    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        Future<String>  user  = scope.fork(() -> findUser());
        Future<Integer> order = scope.fork(() -> fetchOrder());

        scope.join();           // Join both forks
        scope.throwIfFailed();  // ... and propagate errors

        // Here, both forks have succeeded, so compose their results
        return new Response(user.resultNow(), order.resultNow());
    }
}

Java 的多线程对开发者历来都是“魔鬼”,这个特性有望改善这一状况。

a04b8f24c48d0f6228158933a24142a9.gif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 19 正式发布,改善多线程、并发编程难度 的相关文章

  • 终极解决python安装包时需要Microsoft Visual C++ 14.0的问题

    问题 Windows平台在pip install wordcloud包时需要安装 Microsoft Visual C 43 43 14 0 xff0c 而Microsoft Visual C 43 43 14 0 对应的是Microsof
  • Ubuntu18.04屏幕分辨率问题

    Ubuntu18 04屏幕分辨率问题 起因 本来昨天还好好的 xff0c 过了一夜 xff0c 就变了 xff0c 像极了咳咳 自行脑补 redwallbot 2小车上固定的屏幕 xff0c 屏幕分辨率本来应该是1920x1080的 xff
  • Android解决No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-and问题。

    问题说明 xff1a 导入下载的项目编译报错 错误如下 xff1a No toolchains found in the NDK toolchains folder for ABI with prefix mips64el linux an
  • Ubuntu Vim设置

    cp etc vim vimrc vimrc vi etc vim vimrc 针对所有用户 vi vimrc 针对user 34 关闭兼容功能 set nocompatible 34 显示行号 set number 34 编辑时 back
  • STM32CubeMX在freeRTOS中使用printf函数

    在usart h中添加 inlcude 34 stdio h 34 Includes include 34 main h 34 USER CODE BEGIN Includes include 34 stdio h 34 USER CODE
  • CUBEMX建立freeRTOS工程编译报错

    Middlewares Third Party FreeRTOS Source portable RVDS ARM CM3 portmacro h 167 error unknown type name 39 forceinline 39
  • STM32HAL库串口中断同时收发卡死

    在使用HAL库的过程中发现在串口中断的回显功能 xff08 将串口接收到的数据再发送出来 xff09 xff0c 总是执行几次后程序卡死 xff0c 无法正常回显 经过一系列查找后发现原因是STM32 HAL库在处理接收的时候会锁一下串口一
  • 二级指针作为形参简单实例分析

    指针是什么 xff1f 指针是程序数据在内存中的地址 xff0c 而指针变量是用来保存这些地址的变量 举例 int c 61 2 d 61 3 int pc 61 amp c pc是指针变量的存储内容 xff0c 也就是c的地址 pc就是对
  • OutputDebugString 封装;方便格式化

    自定义 xff1a OutputDebugString void MyOutputDebugString LPCTSTR lpszFmt if 1 如果不用了可以修改 va list args va start args lpszFmt i
  • 创建一个最简单的链表,插入和删除

    原创文章欢迎转载 创建一个链表 一 头插法创建链表 xff1a include lt stdio h gt struct list int num struct list next typedef struct list list sing
  • C语言循环链表创建,遍历,插入,删除,查找

    在开始程序之前说一个困扰的几天的东西 xff0c 在链表做形参的时候什么时候用 xff08 p xff09 什么时候用 xff08 p xff09 答案 xff1a 只要是要修改head指针必须传递head的地址 xff08 用 p xff
  • C语言顺序表的插入删除

    首先声明一个顺序表的结构 数组的第一个元素是0 xff0c 但是顺序表的第一个一般 从1 人为设定 开始 include lt stdio h gt include lt stdlib h gt define MAXSIZE 10 defi
  • 蓝牙HC05模块探究-设置AT指令

    蓝牙HC05是主从一体的蓝牙串口模块 xff0c 简单的说 xff0c 当蓝牙设备与蓝牙设备配对连接成功后 xff0c 我们可以忽视蓝牙内部的通信协议 xff0c 直接将将蓝牙当做串口用 当建立连接 xff0c 两设备共同使用一通道也就是同
  • WPF、C# iconfont图标字体只显示框框

    在我们写C 或者WPF 程序的时候 xff0c 引入字体图标的时候 xff0c 新手会出现下面这个问题 xff1b 下面说下常见的两个原因吧 xff1a 1 是文件路径定义的不对 xff1a lt TextBlock Text 61 34
  • Linux执行curl报错:Protocol htttp not supported or disabled in libcurl

    因为公司最近要用到docker xff0c 在学习过程中 构建了一个简单web镜像 xff0c 用于测试 通过curl访问地址时 xff0c 报错 随便百度下 xff0c 也没看懂 仔细一看 xff0c 原来是http写成htttp了 所以
  • Android 获取应用信息—PackageManager

    Android 的应用管理主要是通过PackageManagerService来完成的 PackageManagerService服务负责各种APK包的安装 卸载 优化和查询 PackageManagerService在启动时会扫描所有的A
  • eclipse自动补全不生效解决方法

    eclipse有时候设置了自动补全 xff0c 但明明设置了自动补全却没生效的解决办法 xff0c 按照图片上标注序号一步步进入Advanced页面后 xff0c 勾选第四步的三项选项即可 xff0c 重新生效 xff0c 如下
  • 史上最全的C++面试宝典(合集)

    参考 xff1a https www runoob com cplusplus cpp tutorial html 本教程旨在提取最精炼 实用的C 43 43 面试知识点 xff0c 供读者快速学习及本人查阅复习所用 目录 第一章 C 43
  • 电脑主板,显卡,CPU天梯图

    17年6月主板天梯图 18年2月显卡天梯图 18年3月CPU天梯图
  • sqlserver 批量删除存储过程

    sqlserver 2005一次只能删除一个存储过程 xff0c 如果多了 xff0c 需要很长时间才能删完 xff0c 所以写了一段语句 xff0c 直接就把当然数据库下所有用户自定义的存储过程给drop了 不过使用都请留心 xff0c

随机推荐

  • win7开启wifi共享(热点)

    1 首先在电脑左下方搜索cmd xff0c 以管理员身份运行 输入命令 xff1a netsh wlan set hostednetwork mode 61 allow ssid 61 4Gtest key 61 12345678 ssid
  • Spring官方提供【CSRF攻击】解决方案

    步入正文 Cookie cookie是我们常见用来保存用户态信息 xff0c cookie跟随我们的请求自动携带 在同一域名下的请求 xff0c cookie总是自动携带 用户态 当前登入者的用户信息 以上的特性会导致一个潜在漏洞 CSRF
  • RocketMQ 一个topic 多个消费者只有一个消费的问题

    前言 很多时候 xff0c 我们会在多个地方同时订阅一个 topic xff0c 但是发现消费者只能执行一个后注册消费者会顶替之前注册的消费者 原因 在 subscribeTable 和 subscriptionInner 方法中 xff0
  • 如何快速学习一门新计算机语言

    本来想总结老师的方法的 xff0c 可在网上找到一篇一模一样的 xff0c 为了保证原创性 xff0c 所以只好直接引用啦 点击打开链接 如何快速学习一门新计算机语言
  • 福利抽奖 | 开源企业级监控Zabbix6.0都有哪些亮点

    Zabbix是企业级开源监控解决方案 xff0c 支持实时监控数万台服务器 虚拟机和网络设备 xff0c 采集百万级监控指标 xff0c 提供跨平台支持 Zabbix完全开源免费 xff0c 社区十分活跃 xff0c 生态建设良好 xff0
  • Git的一些常用概念

    git思维导图 Git工作区域 为了说明我们日常开发中执行的一系列Git命令的作用是什么 xff0c 我们需要了解Git的工作区域的概念 xff0c 几乎每一个常见的Git命令操作都可以通过工作区域来解释 Git本地有四个工作区域 xff1
  • 有没有完全自主的国产化数据库技术

    前段时间的俄乌冲突 xff0c Oracle 宣布 暂停在俄罗斯的所有业务 xff0c 相信大家的心情绝不是隔岸观火 xff0c 而是细思恐极 数据库号称 IT 领域三大核心之一 xff08 其他两个是 CPU 和操作系统 xff09 xf
  • 多个线程之间如何协同

    1 CountDownLatch 计数器 在多线程协作完成任务的时候 xff0c 有时候需要等待其他线程完成任务后 xff0c 主线程才能继续执行 xff0c 我们可以使用 Thread 类的 join 方法 xff0c 让主线程等待被 j
  • 利用Sharding-JDBC 实现Mysql读写分离

    为什么要读写分离 xff1f 读写分离则是将事务性的增 改 删操作在主库执行 xff0c 查询操作在从库执行 一般业务的写操作都是比较耗时 xff0c 为了避免写操作影响查询的效率 xff0c 可以使用读写分离 当然读写分离并不是万能的 x
  • 并发编程的核心问题

    并发编程并不是一项孤立存在的技术 xff0c 也不是脱离现实生活场景而提出的一项技术 相反 xff0c 并发编程是一项综合性的技术 xff0c 同时 xff0c 它与现实生活中 的场景有着紧密的联系 并发编程有三大核心问题 xff1a 分工
  • windows xp管理工具不见了怎么办

    管理工具其实是一个文件夹C ProgramData Microsoft Windows Start Menu Programs Administrative Tools 管理工具里的内容就是这个文件夹里的内容 xff0c 你的内容不见了 x
  • 分享搭建脚手架的一些经验

    印象中有些日子没有写文章了 xff0c 最近一直在放飞自我 xff0c 今天和大家分享的一些在搭建脚手架和编程中的一些实践原则 所有目标都是 清晰架构分层 使用统一的依赖管理 这种方式是基于我多年来的实践 最开始我也将项目类库及其版本随意的
  • POJO、Java Bean是如何定义的

    之前介绍过DTO PO VO的转换 xff0c 在日常开发中还有一些类经常被人叫做POJO xff0c 还有的人叫它们Java Bean 这些概念都是在特定场景下引入 xff0c 用来表明它们的特性的 那这些称呼都是啥意思 xff0c 有啥
  • Maven依赖的作用域你到底用对了没有

    Maven是目前Java开发主要使用的依赖管理构建工具之一 xff0c 但是很多人在引用依赖的时候直接引用坐标 xff0c 而没有考虑依赖的作用范围 xff0c 结果导致出现这样和那样的问题 今天胖哥就来说明一下Maven引用依赖的一个要点
  • 胖哥亲自带你玩转Spring Security OAuth2

    参与Spring Security与OAuth2专栏限定免费学习群 xff0c 请从活动主页扫描第三个专栏学习群二维码入群 xff01 关于21天学习挑战赛活动细节 xff0c 请从点击活动主页了解 作者介绍 码农小胖哥 xff0c Spr
  • 21天,胖哥亲自带你玩转OAuth2

    参与Spring Security与OAuth2专栏限定免费学习群 xff0c 请从阅读原文扫描第三个专栏学习群二维码入群 xff01 关于21天学习挑战赛活动细节 xff0c 请点击 阅读原文了解 作者介绍 码农小胖哥 xff0c Spr
  • StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库?

    近些年 xff0c HTAP 正在受到人们越来越多的关注 xff0c Gartner 在 2014 年提出了 HTAP 这个术语和它的定义 xff1a Hybrid transaction analytical processing HTA
  • 聊聊数据库建表的15个小技巧

    前言 对于后端开发同学来说 xff0c 访问数据库 xff0c 是代码中必不可少的一个环节 系统中收集到用户的核心数据 xff0c 为了安全性 xff0c 我们一般会存储到数据库 xff0c 比如 xff1a mysql xff0c ora
  • 【收藏备用】15大超全应用场景总结,进阶主机安全

    随着业务数字化转型 xff0c 企业的业务变得越来越开放和灵活 xff0c 面临的安全挑战也日益增加 在这种多变 开放的场景下 xff0c 无论安全边界怎么做 xff0c 都无法阻挡黑客打破边界进入企业内部来窃取核心资产 当下安全对抗以及安
  • Java 19 正式发布,改善多线程、并发编程难度

    Java 19 在数分钟前正式发布 xff0c 这是一个非 LTS xff08 长期支持 xff09 版本 该版本的七项功能包括结构化并发 记录模式 外部函数和内存 API 的预览 xff0c 以及对开源 Linux RISC V 指令集架